[C#] Gibt es Gründe, private Eigenschaften in C # zu verwenden?



Answers

Die primäre Verwendung von diesem in meinem Code ist faul Initialisierung, wie andere erwähnt haben.

Ein weiterer Grund für private Eigenschaften gegenüber Feldern ist, dass private Eigenschaften viel einfacher zu debuggen sind als private Felder. Ich möchte häufig Dinge wissen wie: "Dieses Feld wird unerwartet eingestellt. Wer ist der erste Anrufer, der dieses Feld einstellt?" und es ist viel einfacher, wenn du einfach einen Haltepunkt auf den Setzer setzen und loslegen kannst. Sie können sich einloggen. Sie können Leistungsmesswerte dort eingeben. Sie können Konsistenzprüfungen einfügen, die im Debug-Build ausgeführt werden.

Im Grunde kommt es darauf an: Code ist viel mächtiger als Daten . Jede Technik, mit der ich den Code schreiben kann, den ich brauche, ist gut. Felder lassen dich nicht Code schreiben, Eigenschaften tun es.

Question

Ich habe gerade festgestellt, dass das C # -Eigenschaftskonstrukt auch mit einem privaten Zugriffsmodifizierer verwendet werden kann:

private string Password { get; set; }

Obwohl das technisch interessant ist, kann ich mir nicht vorstellen, wann ich es verwenden würde, da ein privates Feld noch weniger Zeremonien beinhaltet :

private string _password;

und ich kann mir nicht vorstellen, wann ich jemals intern in der Lage sein könnte , aber nicht zu setzen oder zu setzen, aber kein privates Feld bekommen:

private string Password { get; }

oder

private string Password { set; }

aber vielleicht gibt es einen Anwendungsfall mit verschachtelten / vererbten Klassen oder vielleicht, wo ein Get / Set Logik enthalten könnte, anstatt nur den Wert der Eigenschaft zurückzugeben, obwohl ich dazu neigen würde, Eigenschaften einfach zu halten und explizite Methoden irgendeine Logik zu machen. zB GetEncodedPassword() .

Verwendet jemand private Eigenschaften in C # aus irgendeinem Grund oder ist es nur einer dieser technisch möglichen - noch-selten-verwendet-in-tatsächlichen-Code-Konstrukte?

Nachtrag

Schöne Antworten, beim Durchlesen habe ich diese Nutzungen für private Immobilien aussortiert:

  • wenn private Felder faul geladen werden müssen
  • wenn private Felder zusätzliche Logik oder berechnete Werte benötigen
  • da private Felder schwierig zu debuggen sein können
  • um "sich einen Vertrag zu geben"
  • eine exponierte Eigenschaft als Teil der Serialisierung intern konvertieren / vereinfachen
  • Wrapping globaler Variablen, die in Ihrer Klasse verwendet werden sollen



Lazy Initialisierung ist ein Ort, an dem sie ordentlich sein können, z

private Lazy<MyType> mytype = new Lazy<MyType>(/* expensive factory function */);

private MyType MyType { get { return this.mytype.Value; } }

// In C#6, you replace the last line with: private MyType MyType => myType.Value;

Dann können Sie schreiben: this.MyType überall statt this.mytype.Value und kapseln die Tatsache, dass es an einem einzigen Ort instanziiert ist.

Eine Sache, die schade ist, ist, dass C # nicht unterstützt, das Hintergrundfeld auf die Eigenschaft zu beschränken (dh es in der Eigenschaftendefinition zu deklarieren), um es vollständig zu verbergen und sicherzustellen, dass nur über die Eigenschaft zugegriffen werden kann.




Die einzige Verwendung, die ich mir vorstellen kann

private bool IsPasswordSet 
{ 
     get
     {
       return !String.IsNullOrEmpty(_password);
     }
}



Eigenschaften und Felder sind nicht eins zu eins. Eine Eigenschaft bezieht sich auf die Schnittstelle einer Klasse (unabhängig davon, ob sie über ihre öffentliche oder interne Schnittstelle spricht), während sich ein Feld auf die Implementierung der Klasse bezieht. Eigenschaften sollten nicht als eine Möglichkeit betrachtet werden, Felder bloß zu exponieren, sie sollten als eine Möglichkeit gesehen werden, die Absicht und den Zweck der Klasse offenzulegen.

Genauso wie Sie Immobilien verwenden, um Ihren Kunden einen Vertrag über den Inhalt Ihrer Klasse vorzulegen, können Sie sich aus ähnlichen Gründen auch einen Vertrag vorlegen. Also ja, ich benutze private Eigenschaften, wenn es Sinn macht. Manchmal kann eine private Eigenschaft Implementierungsdetails verbergen, wie zum Beispiel das verzögerte Laden, die Tatsache, dass eine Eigenschaft tatsächlich ein Konglomerat mehrerer Felder und Aspekte ist, oder dass eine Eigenschaft bei jedem Aufruf virtuell instanziiert werden muss (denke DateTime.Now ). Es gibt definitiv Zeiten, in denen es sinnvoll ist, dies selbst im Backend der Klasse zu erzwingen.




Es ist üblich, nur Mitglieder mit get / set-Methoden zu modifizieren, auch private. Nun, die Logik dahinter ist, dass Sie wissen, dass sich Ihr get / set immer auf eine bestimmte Art und Weise verhält (zum Beispiel Ereignisse abfeuern), was nicht sinnvoll erscheint, da diese nicht in das Property-Schema aufgenommen werden ... aber alte Gewohnheiten sterben schwer.




Ich verwende private Eigenschaften, um den Code für den Zugriff auf häufig verwendete Untereigenschaften zu reduzieren.

    private double MonitorResolution
    {
        get { return this.Computer.Accesories.Monitor.Settings.Resolution; }
    }

Es ist nützlich, wenn viele Untereigenschaften vorhanden sind.






Links