2010-08-02 11 views
5

W języku C#, możliwe jest zdefiniowanie funkcji readonly getter nie definiując ustawioną funkcję tak:Czy istnieje sposób zdefiniowania funkcji getter w języku C# jako ReadOnly podobnie jak VB.NET?

private int _id; 

public int Id 
{ 

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

w VB.NET

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

to możliwe, aby oznaczyć taką funkcję readonly jak można w VB .NET, aby być bardziej szczegółowe?

+2

Aby być bardziej gadatliwym ?! To właśnie vb jest dla ... – Tahbaza

+0

Kiedy mówisz "bardziej gadatliwy", o czym mówisz? Za pomocą przykładu kodu otrzymasz taki sam błąd kompilatora, jak w VB.NET, jeśli próbowałbyś go przypisać. Intellisense powinien także zidentyfikować go jako element do pobrania. –

+1

@ Jonathan: Bardziej szczegółowe, ponieważ czytelnik jest bardziej przejrzysty niż wnioskowanie, że jest to własność tylko do odczytu. –

Odpowiedz

10

Nie wiem, co daje ReadOnly w VB. Chyba najbardziej wyraźne można dostać jest rzeczywiście mniej gadatliwy:

public int Id { get; private set; } 

W języku C#, readonly wskazuje, że wartość polu jest ustawione podczas tworzenia obiektu i jest niezmienny po wyprowadzeniu konstruktora. Można to osiągnąć poprzez:

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

public int Id 
{ 
    get { return _id; } 
} 

Niestety automatycznych właściwości (jak pokażę w pierwszym fragmencie kodu) nie mogą być readonly. Oznacza to, że musisz samodzielnie wymusić semantykę tylko do odczytu, upewniając się, że żaden kod twojej klasy nie wywołuje ustawienia prywatnego po zakończeniu konstruktora. Wydaje mi się, że różni się to od tego, co masz na myśli, używając VB w wersji ReadOnly.

EDYTOWANIE Jak wskazuje Thomas, posiadanie go nie różni się od posiadania prywatnego. Jednak VB's usage of ReadOnly różni się od C# jeden, przynajmniej w przypadku korzystania z właściwości:

' 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 

Aby programista C#, słowo kluczowe ReadOnly wydaje się zbędny. Wynika to już z faktu, że nie istnieje żaden ustawodawca.

Jeśli chodzi o pola, C# i VB wydają się równoważne.

+1

Posiadanie prywatnego setera nie jest tym samym, co seter. Oznacza to, że seter może być dostępny tylko z poziomu klasy. Taka własność jest tylko do odczytu tylko z zewnątrz –

Powiązane problemy