C # 3.0: Automatische Eigenschaften - was wäre der Name einer privaten Variablen, die vom Compiler erstellt wurde

7

Ich habe die neuen Funktionen von .NET 3.5 überprüft und festgestellt, dass wir in C # 3.0

verwenden können %Vor%

statt

%Vor%

Wenn ich die automatischen Eigenschaften verwende, wie lautet der Name der privaten Variablen für Name? Die Tutorials im Internet sagen, dass der Compiler automatisch eine private Variable erstellen wird. Wie kann ich die private Variable verwenden / auf sie zugreifen, wenn ich sie in einer Methode in dieser Klasse verwenden möchte?

    
Shyju 14.08.2009, 09:57
quelle

4 Antworten

17

Umgeschrieben, um klarer zu sein

Das Feld ist in Ordnung, aber es ist für Ihren Code nicht als normales Feld sichtbar.

Hier ist Ihre typische automatische Eigenschaft:

%Vor%

, das, wenn wir die kompilierte Assembly betrachten, dieses Hintergrundspeicherfeld erzeugt:

%Vor%

Beachten Sie die & lt; und & gt; da drin, das sind keine Zeichen, die du in deinen eigenen Feldnamen verwenden kannst. Sie können auch nicht auf dieses Feld zugreifen, da es nicht so weit existiert, wie es der Compiler interessiert, wenn er Ihren Code betrachtet.

Die eigentliche Frage von mir ist warum Sie auf dieses Feld zugreifen möchten. Mit anderen Worten, warum benötigen Sie Zugriff auf das Feld und was macht es für Ihren Code, den der Zugriff auf die Eigenschaft nicht tun?

Wenn Sie externen Schreibzugriff auf das Feld verhindern möchten, können Sie dies leicht tun, indem Sie die Setter-Methode wie folgt privat machen:

%Vor%

Da das Feld tatsächlich in der Assembly vorhanden ist, bedeutet dies, dass es sich nicht um JITter-Magie handelt, sondern um Compiler-Magie, und Sie könnten Reflektion verwenden, um dieses Feld zu finden und darauf zuzugreifen.

Aber nochmal, warum wolltest du das?

Nehmen wir nun an, dass es wirklich einen legitimen Grund dafür gibt, dass Sie das Feld anstelle der Eigenschaft verwenden möchten. Ich kann mir eins 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 möchten:

%Vor%

Sie können Eigenschaften nicht als out / ref-Parameter übergeben, daher funktioniert dieser Code nicht:

%Vor%

In diesem Fall müssen Sie auf die "alte" Art und Weise, Eigenschaften zu definieren, zurückgreifen, indem Sie das Hintergrundspeicherfeld wie folgt manuell hinzufügen:

%Vor%

Damit können Sie diese Methode aufrufen:

%Vor%

Allerdings würde ich diese Methode wahrscheinlich ändern, um den neuen Wert zurückzugeben, anstatt eine referenzierte Variable direkt anzupassen.

    
Lasse Vågsæther Karlsen 14.08.2009, 10:00
quelle
4

Wie bereits gesagt: Sie können nicht auf die automatisch generierte Variable zugreifen (ohne schlechte Tricks zu verwenden). Aber ich nehme an, dass Sie diese Frage stellen, weil Sie nur einen Getter haben wollen, aber immer noch automatische Eigenschaften verwenden wollen ... richtig? In diesem Fall können Sie diesen verwenden:

%Vor%

Jetzt haben Sie einen privaten Setter und einen öffentlichen Getter.

    
Achim 14.08.2009 10:09
quelle
1

Wenn Sie automatische Eigenschaften verwenden, können Sie nicht auf das private Feld zugreifen. Es ist nicht nur privat, es ist auch anonym.

    
John Saunders 14.08.2009 09:59
quelle
0
  

Wie kann ich die private Variable verwenden / auf sie zugreifen, wenn ich sie in einer Methode in dieser Klasse verwenden möchte?

In Ihrem Quellcode müssen Sie nur mit dem Property Accessor person.LastName oder LastName arbeiten und dürfen nur dann arbeiten, wenn Sie Code in der Personenklasse schreiben.

Der Compiler erstellt automatisch eine private Member-Variable oder ein Backing-Feld, aber das existiert im CIL -Code. Es existiert nirgendwo in Ihrem Quellcode.

    
Saajid Ismail 14.08.2009 10:12
quelle

Tags und Links