Tak, oba są tylko do odczytu, ale istnieje różnica. W pierwszym jest pole zapasowe, które jest inicjowane na 0 przed wykonaniem konstruktora. Możesz zmienić wartość tylko w konstruktorze , tak jak zwykłe pole tylko do odczytu. Sam getter po prostu zwraca wartość pola.
W drugim getter po prostu zwraca 0 za każdym razem, bez żadnego pola.
Aby w ogóle uniknąć używania jakichkolwiek automatycznie implementowanych właściwości lub elementów składowych zawierających wyrażenie, mamy:
Pierwsza wersja
private readonly int _number = 0;
public int Number { get { return _number; } }
Druga wersja
public int Number { get { return 0; } }
Wyraźniejszy przykład tej różnicy można zobaczyć w następujący sposób:
public DateTime CreationTime { get; } = DateTime.UtcNow;
public DateTime CurrentTime => DateTime.UtcNow;
Jeśli utworzysz pojedynczy obiekt, jego CreationTime
właściwość zawsze da ten sam wynik - ponieważ jest przechowywana w polu tylko do odczytu, zainicjowana podczas konstrukcji obiektu. Jednak za każdym razem, gdy uzyskasz dostęp do CurrentTime
właściwości, zostanie DateTime.UtcNow
ona oceniona, więc otrzymasz potencjalnie inny wynik.
random.NextInt()
. Pierwsza wersja oceni to raz i zawsze będzie miała tę samą wartość. Drugi za każdym razem zwróci nową wartość.Jedna różnica polega na tym, że
0
jest to oceniane: podczas tworzenia obiektu lub gdy właściwość jest używana.Możesz to lepiej zobaczyć dzięki właściwościom DateTime:
Start
Nieruchomość utrzymuje wracając tym samym czasie (na przykład, gdy został stworzony), natomiastNow
zmiany w celu odzwierciedlenia bieżącego czasu.Wyjaśnienie :
Pierwsza wersja („Start”) dostarcza wartość początkową, która może nawet zostać nadpisana przez konstruktora. Więc to jest oceniane tylko raz.
Druga wersja („Now”) zawiera wyrażenie, które będzie „pobierającym” dla tej właściwości. Więc jest to oceniane za każdym razem, gdy właściwość jest odczytywana. Nie ma nawet pola zapasowego, które konstruktor mógłby nadpisać.
źródło
To są funkcje języka C # 6.
Pierwszy przykład
Pierwszym przykładem jest właściwość automatyczna tylko do pobierania . Pole zapasowe właściwości automatycznej tylko do pobierania jest niejawnie deklarowane jako tylko do odczytu.
Drugi przykład
Drugim przykładem są ciała wyrażeń na elementach składowych funkcji podobnych do właściwości . Zauważ, że nie ma żadnego
get
słowa kluczowego: jest to sugerowane przez użycie składni ciała wyrażenia.Oba są tylko do odczytu.
źródło