2010-08-02 5 views
5

In C#, ist es möglich, eine readonly Getter-Funktion durch nicht definiert, die eingestellte Funktion wie so zu definieren:Gibt es eine Möglichkeit, eine Getter-Funktion in C# als ReadOnly wie VB.NET zu definieren?

private int _id; 

public int Id 
{ 

    get { return _id; } 
    // no setter defined 
} 

in VB.NET

Private _id as Integer 
Public Readonly Property Id() As Integer 
    Get 
     Return _id 
    End Get 
End Property 

Ist es möglich, eine solche Funktion zu markieren, wie readonly wie Sie in VB .NET, um ausführlicher zu sein?

+2

Um ausführlicher zu sein ?! Das ist, was vb ist für ... – Tahbaza

+0

Wenn Sie sagen "mehr wortreich", was meinen Sie? Mit Ihrem Codebeispiel erhalten Sie den gleichen Compilerfehler wie in VB.NET, wenn Sie versucht haben, ihm zuzuordnen. Intellisense sollte es auch als einen nur abrufbaren Gegenstand identifizieren. –

+1

@ Jonathan: Ausführlicher darin, dass es für den Leser klarer ist als durch Schlussfolgerung, dass es eine readonly Eigenschaft ist. –

Antwort

10

Ich weiß nicht, was die ReadOnly gibt Ihnen in VB. Ich denke, die deutlichste man bekommen kann tatsächlich weniger ausführlich ist:

public int Id { get; private set; } 

In C# readonly zeigt an, dass der Wert eines Feldes bei der Erstellung des Objekts festgelegt und ist unveränderlich nach den Konstruktor beendet.

private readonly int _id; // note field marked as 'readonly' 

public int Id 
{ 
    get { return _id; } 
} 

Leider automatische Eigenschaften (wie zeige ich in dem ersten Code-Schnipsel) werden nicht als readonly erlaubt: Man könnte über erreichen, dass. Das bedeutet, dass Sie die schreibgeschützte Semantik selbst erzwingen müssen, indem Sie sicherstellen, dass keiner der Klassencodes den privaten Setter aufruft, nachdem der Konstruktor beendet wurde. Ich denke, das ist anders als das, auf das Sie sich beziehen, wenn VB ReadOnly verwendet.

BEARBEITEN Wie Thomas hervorhebt, unterscheidet sich Getter nicht von einem privaten. Allerdings ist VB's usage of ReadOnly anders als die C# ein, zumindest, wenn sie mit Eigenschaften verwendet:

' Only code inside class employee can change the value of hireDateValue. 
Private hireDateValue As Date 
' Any code that can access class employee can read property dateHired. 
Public ReadOnly Property dateHired() As Date 
    Get 
     Return hireDateValue 
    End Get 
End Property 

Zu einem C# -Programmierer, das ReadOnly Schlüsselwort überflüssig erscheinen würde. Dies wird bereits durch die Tatsache impliziert, dass kein Setter existiert.

Soweit Felder betroffen sind, scheinen C# und VB gleichwertig.

+1

Einen privaten Setter zu haben ist nicht der gleiche wie kein Setter ... Es bedeutet nur, dass der Setter nur von innerhalb der Klasse zugänglich ist. Eine solche Eigenschaft ist nur von außen schreibgeschützt –

Verwandte Themen