Umgeschrieben, um mehr Klarheit zu schaffen
Das Feld wird zwar generiert, aber es ist für Ihren Code nicht als normales Feld sichtbar.
Das ist die typische automatische Eigenschaft:
public string FirstName { get; set; }
was, wenn wir uns die kompilierte Assembly ansehen, dieses Backing-Store-Feld erzeugt:
[CompilerGenerated]
private string <FirstName>k__BackingField;
Beachten Sie die Zeichen < und >, die Sie nicht in Ihren eigenen Feldnamen verwenden können. Sie können auch nicht auf dieses Feld zugreifen, da es für den Compiler nicht "existiert", wenn er sich Ihren Code ansieht.
Die eigentliche Frage, die sich mir stellt, ist por qué Sie auf dieses Feld zugreifen möchten. Mit anderen Worten, warum brauchen Sie Zugriff auf das Feld, und was tut es für Ihren Code, dass der Zugriff auf die Eigenschaft nicht tun?
Wenn Sie den Schreibzugriff von außen auf das Feld verhindern wollen, ist das leicht möglich, indem Sie die Setter-Methode privat machen, etwa so:
public string FirstName { get; private set; }
Da das Feld tatsächlich in der Assembly vorhanden ist, bedeutet dies, dass es sich nicht um JITter-Magie, sondern um Compiler-Magie handelt, so dass Sie Reflection verwenden können, um das Feld zu finden und darauf zuzugreifen.
Aber noch einmal: Warum sollten Sie das wollen?
Nehmen wir einmal an, dass es wirklich einen legitimen Grund dafür gibt, dass Sie das Feld anstelle der Eigenschaft verwenden wollen. Ich kann mir einen vorstellen, obwohl ich es wahrscheinlich anders machen würde, und das wäre, dass Sie den Feldnamen als Out- oder Ref-Parameter an eine Methode übergeben wollen, wie hier:
public void AdjustName(ref String name)
{
name = Capitalize(name);
}
Sie können keine Eigenschaften als out/ref-Parameter übergeben, daher wird dieser Code nicht funktionieren:
AdjustName(ref string FirstName);
In diesem Fall müssen Sie auf die "alte" Methode der Eigenschaftsdefinition zurückgreifen und das Feld "Backing Store" manuell hinzufügen, etwa so:
private string firstName;
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
Damit können Sie diese Methode aufrufen:
AdjustName(ref string firstName); // note the field, not the property
Allerdings würde ich diese Methode wahrscheinlich so ändern, dass der neue Wert zurückgegeben wird, anstatt eine referenzierte Variable direkt anzupassen.
3 Stimmen
Beachten Sie, dass dies ein Feature von C# 3.0 ist, nicht von .NET 3.5 - Sie können es auch verwenden, wenn Sie .NET 2.0 von einem C# 3.0-Compiler aus anvisieren.
0 Stimmen
Mögliche Duplikate von Ist die Implementierung von Auto Properties in der Spezifikation enthalten?