Odpowiedzi:
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.
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:
class SomeTestClass
{
public DateTime Start { get; } = DateTime.Now;
public DateTime Now => DateTime.Now;
}
Start
Nieruchomość utrzymuje wracając tym samym czasie (na przykład, gdy został stworzony), natomiast Now
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ć.
To są funkcje języka C # 6.
Pierwszy przykład
public int Number { get; } = 0
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
public int Number => 0;
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.
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ść.