Antworten:
Ja, beide sind schreibgeschützt, aber es gibt einen Unterschied. Im ersten gibt es ein Hintergrundfeld, das vor der Ausführung des Konstruktors auf 0 initialisiert wird. Sie können den Wert nur im Konstruktor ändern , genau wie in einem normalen schreibgeschützten Feld. Der Getter selbst gibt nur den Wert des Feldes zurück.
Im zweiten Fall gibt der Getter jedes Mal nur 0 zurück, ohne dass ein Feld beteiligt ist.
Um zu vermeiden, dass automatisch implementierte Eigenschaften oder ausdrucksstarke Elemente verwendet werden, haben wir:
Erste Version
private readonly int _number = 0;
public int Number { get { return _number; } }
Zweite Version
public int Number { get { return 0; } }
Ein klareres Beispiel für den Unterschied könnte folgendermaßen gesehen werden:
public DateTime CreationTime { get; } = DateTime.UtcNow;
public DateTime CurrentTime => DateTime.UtcNow;
Wenn Sie ein einzelnes Objekt erstellen, CreationTime
liefert seine Eigenschaft immer das gleiche Ergebnis, da es in einem schreibgeschützten Feld gespeichert ist, das bei der Objektkonstruktion initialisiert wurde. Jedes Mal, wenn Sie auf die CurrentTime
Eigenschaft zugreifen , wird DateTime.UtcNow
dies jedoch ausgewertet, sodass Sie möglicherweise ein anderes Ergebnis erhalten.
Ein Unterschied besteht darin, wann dies 0
ausgewertet wird: bei der Objekterstellung oder wenn die Eigenschaft verwendet wird.
Sie können dies mit den DateTime-Eigenschaften besser sehen:
class SomeTestClass
{
public DateTime Start { get; } = DateTime.Now;
public DateTime Now => DateTime.Now;
}
Die Start
Eigenschaft gibt immer dieselbe Zeit zurück (zum Zeitpunkt der Erstellung der Instanz), während Now
Änderungen vorgenommen werden, um die aktuelle Zeit wiederzugeben.
Erklärung :
Die erste Version ("Start") liefert einen Anfangswert, der möglicherweise sogar vom Konstruktor überschrieben wird. Dies wird also nur einmal ausgewertet.
Die zweite Version ("Jetzt") enthält den Ausdruck, der der "Getter" dieser Eigenschaft sein wird. Dies wird also jedes Mal ausgewertet, wenn die Eigenschaft gelesen wird. Es gibt nicht einmal ein Hintergrundfeld, das der Konstruktor überschreiben kann.
Dies sind C # 6-Sprachfunktionen.
Erstes Beispiel
public int Number { get; } = 0
Das erste Beispiel ist eine Nur-Getter-Auto-Eigenschaft . Das Hintergrundfeld einer Nur-Getter-Auto-Eigenschaft wird implizit als schreibgeschützt deklariert.
Zweites Beispiel
public int Number => 0;
Das zweite Beispiel sind Ausdruckskörper auf eigenschaftsähnlichen Funktionselementen . Beachten Sie, dass es kein get
Schlüsselwort gibt: Es wird durch die Verwendung der Ausdruckskörpersyntax impliziert.
Beide sind schreibgeschützt.
random.NextInt()
. Die erste Version wertet das einmal aus und hat immer den gleichen Wert. Der zweite gibt jedes Mal einen neuen Wert zurück.