Różnica w C# pomiędzy różnymi stylami gettera

Czasami widzę skróty we właściwościach dla gettera. Np. te dwa typy:

public int Number { get; } = 0

public int Number => 0;
Czy ktoś może mi powiedzieć, czy są jakieś różnice między tymi dwoma. Jak się zachowują? Czy oba są tylko do odczytu?
Author: Pac0, 2017-09-05

3 answers

Tak, oba są tylko do odczytu, ale jest różnica. W pierwszym znajduje się 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 udziału pola.

Tak, aby uniknąć używania dowolnych automatycznie zaimplementowanych Właściwości lub członkowie wyrażeniowi w ogóle, mamy:

Pierwsza wersja

private readonly int _number = 0;
public int Number { get { return _number; } }

Druga wersja

public int Number { get { return 0; } }

Jaśniejszy przykład różnicy można zobaczyć tak:

public DateTime CreationTime { get; } = DateTime.UtcNow;
public DateTime CurrentTime => DateTime.UtcNow;

Jeśli utworzysz pojedynczy obiekt, jego właściwość CreationTime zawsze da ten sam wynik - ponieważ jest przechowywana w polu readonly, zainicjalizowanym podczas budowy obiektu. Jednak za każdym razem, gdy uzyskasz dostęp do właściwości CurrentTime, spowoduje to, że DateTime.UtcNow zostanie oceniona, więc otrzymasz potencjalnie inny wynik.

 264
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-11 17:08:32

Jedna różnica polega na tym, kiedy 0 jest oceniana: podczas tworzenia obiektu lub gdy właściwość jest używana.

Możesz zobaczyć to lepiej z właściwościami DateTime:

class SomeTestClass
{
    public DateTime Start { get; } = DateTime.Now;

    public DateTime Now => DateTime.Now;
}

Właściwość Start zwraca ten sam czas (w którym instancja została utworzona), podczas gdy Now zmienia się, aby odzwierciedlić bieżący czas.

Wyjaśnienie :

Pierwsza wersja ("Start") dostarcza wartość początkową, która może być nawet nadpisana przez konstruktor. Więc to jest oceniane tylko raz.
Druga wersja ("Now") dostarcza wyrażenie, które będzie "getter" tej właściwości. Jest więc obliczana za każdym razem, gdy właściwość jest odczytywana. Nie ma nawet pola zapasowego, które konstruktor może zastąpić.

 247
Author: Hans Kesting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-08 09:52:48

Są to funkcje języka C # 6.

Pierwszy przykład

public int Number { get; } = 0

Pierwszy przykład to Getter-only Auto property. Pole pomocnicze automatycznej właściwości getter jest domyślnie zadeklarowane jako readonly.

Drugi przykład

public int Number => 0;

A drugi przykład to ciała wyrażeń na członach funkcji podobnych do właściwości . Zauważ, że nie ma żadnego słowa kluczowego get: wynika to z użycia składni ciała wyrażenia.

Obie są tylko odczytywane.

 20
Author: Jehof,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-09 11:07:15