Der Unterschied ist, dass der generierte Code ein readonly-Feld im zweiten Fall erzeugt, und offensichtlich wird die Eigenschaft keinen Setter haben.
Lassen Sie uns ein konkretes Beispiel tun:
public class Test
{
public Test(string name) { Name = name; }
public string Name { get; private set; }
}
Der Compiler kompiliert diese wie folgt aus:
public class Test
{
private string <Name>k__BackingField;
public Test(string name)
{
<Name>k__BackingField = name;
}
public string Name
{
get { return <Name>k__BackingField; }
private set { <Name>k__BackingField = value; }
}
}
Wie Sie der Compiler automatisch erkennen kann, hat der Code neu geschrieben für die eine dahinter liegende Feld haben Eigentum. Der Feldname wird dieser kryptische Name sein, der legal ist, aber nicht C#, was bedeutet, dass Sie niemals C# -Code schreiben können, der mit einem solchen automatisch erzeugten Member in Konflikt gerät.
Grundsätzlich ist automatische Eigenschaften in C# nur syntaktische Zucker für eine Eigenschaft mit einem Backing-Feld, die eigentliche Eigenschaft kompiliert haben noch ein Backing-Feld, müssen Sie nur nicht explizit schreiben.
Wie Sie sehen können, wurde der Konstruktor automatisch neu geschrieben, um direkt in das Feld zu schreiben. Beachten Sie, dass dies überall in dieser Klasse erfolgt, in die die Eigenschaft geschrieben wird, da sowieso keine Möglichkeit besteht, dass ein benutzerdefinierter Code dazwischen liegt.
Jetzt wollen wir den Setter aus dem Eigentum entfernen und sehen, was passiert:
public class Test
{
private readonly string <Name>k__BackingField;
public Test(string name)
{
<Name>k__BackingField = name;
}
public string Name
{
get { return <Name>k__BackingField; }
}
}
Beachten Sie, dass das Feld jetzt nur lesbar ist, und wieder, offensichtlich die Setter hat sich von der Eigenschaft als gut gegangen.
Also das jetzt eigentlich der beste Weg ist, einfache Typen mit wahr Nur-Lese-Eigenschaften zu schaffen, ist nicht nur die Eigenschaft selbst nicht beschreibbar, sondern das dahinter liegendes Feld auch nur lesbar ist Sinn sind Sie jetzt besser gerüstet leicht schreiben unveränderliche Typen.
Einfach: Eine Eigenschaft mit einem weggelassenen Setter ** hat keinen Setter **. Sie können die Eigenschaft nicht außerhalb der Eigenschaftsdeklaration oder eines Konstruktors neu zuweisen. – BoltClock
Wie kommt diese Frage upvotes? Ich dachte, das war trivial ... – Alex
Duplikatsalarm: http: //stackoverflow.com/questions/3847832/understanding-privi-setters, http://stackoverflow.com/questions/4948816/getters-setters-and-properties- Best-Practices-Java-vs-C-Sharp – Tushar