2008-09-14 2 views
78

In der Vergangenheit erklärt, wir Eigenschaften wie folgt aus:Wie kann ich auf die Sicherungsvariable einer automatisch implementierten Eigenschaft zugreifen?

public class MyClass 
{ 
    private int _age; 

    public int Age 
    { 
      get{ return _age; } 
      set{ _age = value; } 
    } 
} 

Jetzt können wir tun:

public class MyClass 
{ 
    public int Age {get; set;} 
} 

Meine Frage ist, wie kann ich die private Variable zugreifen, die automatisch mit dieser Notation erstellt wird?

Ich würde lieber auf die private Variable zugreifen und nicht auf den öffentlichen Accessor 'Age'. Gibt es eine Standardnotation für den Zugriff auf die private Variable, oder ist es einfach nicht möglich?

+10

Was ist der Unterschied in diesem Fall des Zugriffs auf den privaten gegen den öffentlichen Accessor? Ich denke, es ist die beste Vorgehensweise, auf den öffentlichen Zugriff zuzugreifen, selbst wenn die Logik in der Deklarationsklasse verwendet wird. Wenn Sie dem Accessor eine Logik hinzufügen, müssen Sie nicht den gesamten Code ändern. –

+0

@ löffel16 Können Sie mir ein Beispiel für das Hinzufügen von Logik zum Accessor geben und als Ergebnis den gesamten Code ändern. Ich habe diesen Teil nicht wirklich verstanden. – Ogen

Antwort

2

Sie können nicht, es ist eine Sprachfunktion im Gegensatz zu einer IDE-Funktion. Um ehrlich zu sein, würde ich dann lieber IDE die private Variable für Sie hinzufügen. Ich stimme zu, dass es etwas seltsam für die Klasse ist, intern den öffentlichen Zugangspunkt zu verwenden, um auf seine eigenen Variablen zuzugreifen. Daher benutze ich dieses neue Feature nicht so sehr.

10

Hinter den Kulissen, was die Injektion eines privaten Variable passiert ist, mit dem Präfix <> k__AutomaticallyGeneratedPropertyField #

Von C# 3.0 Automatic Properties explained

Obwohl es möglich sein kann, direkt, dass privates Element zu verwenden, es ist sehr hacky und unnötig.

12

Diese Syntax wird allgemein als "Syntax Sugar" bezeichnet, was bedeutet, dass der Compiler diese Syntax übernimmt und in etwas anderes übersetzt. In Ihrem Beispiel erzeugen würde der Compiler Code, der etwa wie folgt aussieht:

[CompilerGenerated] 
private int <Age>k_BackingField; 

public int Age 
{ 
    [CompilerGenerated] 
    get 
    { 
     return this.<Age>k_BackingField; 
    } 
    [CompilerGenerated] 
    set 
    { 
     this.<Age>k_BackingField = value; 
    } 

Auch all das zu wissen, man konnte wahrscheinlich Zugriff auf das dahinter liegende Feld direkt, aber diese Art von Niederlagen der Zweck der Verwendung von automatischen Eigenschaften. Ich sage wahrscheinlich hier, weil Sie dann auf ein Implementierungsdetail angewiesen sind, das sich in einer zukünftigen Version des C# -Compilers jederzeit ändern könnte.

23

Ihre Verwendung von automatischen Eigenschaften bedeutet, dass Sie keine Logik zum Abrufen/Festlegen für die Eigenschaft benötigen, daher ist eine private Sicherungsvariable nicht erforderlich.

Verwenden Sie keine automatischen Eigenschaften, wenn Sie komplexe Logik in Ihrer Klasse haben. Gehen Sie einfach private int _age und normale Getter/Setter wie Sie normalerweise würden.

IMO, automatische Eigenschaften sind besser geeignet für das schnelle Wegwerf-Objekte oder temporäre Datenkapseln wie die Umsetzung:

public class TempMessage { 
    public int FromID { get; set; } 
    public int ToID { get; set; } 
    public string Message { get; set; } 
} 

Wo man nicht viel Logik benötigen.

+0

Warum hat das Hinzufügen komplexer Logik zu Ihrer Klasse Auswirkungen darauf, ob Sie automatische Eigenschaften in dieser Klasse verwendet haben oder nicht? –

+0

Mehr von einer Konsistenz-Sache ... Wenn Sie komplexe Logik haben, dann sollten Sie auf die private Unterstützung Variablen per OO Praktiken zugreifen .. und wenn Sie automatische Eigenschaften verwenden dann ... gibt es Inkonsistenzen beim Zugriff auf diese Eigenschaften. da einige Präfixe unterstrichen haben und andere nicht. – chakrit

92

Das Ziel der neuen automatischen Eigenschaften ist es, die Menge an Standardcode zu reduzieren, den Sie schreiben müssen, wenn Sie nur eine einfache Eigenschaft haben, die keine spezielle Logik im Get oder Set benötigt.

Wenn Sie das private Member zugreifen möchten, dass diese Eigenschaften verwenden, das ist in der Regel für ein paar Gründe:

  • Sie müssen mehr als nur eine einfache get/set - in diesem Fall sollten Sie nur vermeiden Verwenden automatischer Eigenschaften für dieses Mitglied.
  • Sie wollen die Leistungseinbußen vermeiden, indem Sie das Get oder Set durchlaufen und das Mitglied direkt verwenden - in diesem Fall wäre ich überrascht, wenn es wirklich einen Leistungseinbruch gäbe. Die einfachen get/set-Member sind sehr einfach zu inline, und in meinen (zugegebenermaßen begrenzten) Tests habe ich keinen Unterschied zwischen der Verwendung der automatischen Eigenschaften und dem direkten Zugriff auf das Member gefunden.
  • Sie möchten nur öffentlichen Lesezugriff haben (d. H. Nur ein 'get') und die Klasse schreibt direkt an das Mitglied - in diesem Fall können Sie einen privaten Satz in Ihrer automatischen Eigenschaft verwenden. das heißt

    public class MyClass 
    { 
        public int Age {get; private set;} 
    }

Diese in der Regel deckt die meisten der Gründe für den Wunsch direkt auf das Trägerfeld durch die automatischen Eigenschaften zu gewöhnen.

+0

Wahr - sie reduzieren den Code der Werferplatte und ich werde auch darauf hinweisen, dass sie das reduzieren, was Sie testen müssen. Einige argumentieren, dass Sie das manuelle Get/Set-Verfahren testen müssen, nicht jedoch die Auto-Eigenschaften, da Sie dem Framework vertrauen können. –

+3

Das Codebeispiel ist hier falsch. Es sollte sein öffentliche Klasse MyClass { public int Alter {erhalten; privates Set;} } Ich stimme dieser Antwort zu. Sie können nicht auf das private Feld zugreifen, und wenn nötig, sollten Sie die automatischen Eigenschaften nicht verwenden. – hwiechers

+0

hwiechers, danke dafür - ich hatte diese Änderung, aber beim Versuch, die Formatierung zu korrigieren, muss ich wieder einfügen und den falschen Codeblock löschen. Do! – Wilka

7

Sie sollten nicht, und es ist sehr unwahrscheinlich, dass Sie müssen. Wenn Sie auf die Eigenschaft zugreifen müssen, verwenden Sie einfach die öffentliche Eigenschaft (z. B. this.Age). Es gibt nichts besonderes an dem privaten Feld, das die öffentliche Eigenschaft stützt, es anstelle der Eigenschaft zu verwenden, ist nur Aberglaube.

+1

Ich habe mich immer gefragt, was der Punkt der automatischen Eigenschaften waren. Wenn Sie keine spezielle Logik in Ihren Getter und Setter haben, warum haben sie überhaupt? –

+4

@MatthewLock Flexibilität. Mit direktem Feldzugriff sind Sie in diesem Design gesperrt, wenn Sie nicht alle Client-Code gleichzeitig ändern. Aber mit einer Eigenschaft, wenn Sie beschließen, es von einem "Pseudo-Feld" in eine berechnete Eigenschaft zu ändern, oder wenn Sie beschließen, Assertions und Checks für den Setter oder What-you-you hinzuzufügen, können Sie dies auf transparente Weise tun. Dies ist noch nützlicher, wenn Sie einen Bibliothekscode schreiben, bei dem Sie nicht den gesamten Client-Code kontrollieren können. – Wedge