tag - user control c# tutorial




Sollte ich öffentliche Eigenschaften und private Felder oder öffentliche Felder für Daten verwenden? (9)

Dafür gibt es viele Gründe.

Hauptsächlich:

  • Sie können einige andere Funktionen ausführen, wenn die Variable festgelegt ist
  • Sie können Einstellungen verhindern und nur erhalten
  • Einige "Dinge" funktionieren nur an Eigenschaften (z. B. DataBinding)
  • Sie können die Implementierung der Eigenschaft ausblenden [möglicherweise ist es eine ViewState-Variable in ASP.NET].

In einem Großteil des Codes, den ich gesehen habe (in SO, dem Codeproject.com und ich tendiere dazu, dies in meinem eigenen Code zu tun), habe ich gesehen, dass öffentliche Eigenschaften für jedes einzelne private Feld einer Klasse erstellt werden, selbst wenn sie am meisten sind grundlegende Art des get; set; get; set; mögen:

private int myInt;
public int MyInt 
{
     get { return myInt; }
     set { myInt = value }
}

Meine Frage ist: Wie unterscheidet sich das von:

public int MyInt;

und wenn wir Eigenschaften anstelle von öffentlichen Feldern verwenden sollten, warum sollten wir sie in diesem speziellen Fall verwenden? (Ich spreche nicht über komplexere Beispiele, bei denen die Getter und Setter tatsächlich etwas Spezielles tun oder es nur ein Get oder Set gibt (nur Lesen / Schreiben) und nicht nur einen Wert eines Private Fields zurückgibt / setzt). Es scheint keine zusätzliche Kapselung hinzuzufügen, geben Sie nur ein schönes Symbol in IntelliSense und in einem speziellen Abschnitt in Klassendiagrammen platziert werden!


Der Punkt ist - was ist, wenn Sie weiter unten die Zeile sicherstellen möchten, dass jedes Mal, myInt referenziert wird, etwas Spezielles passiert (eine Log-Datei wird geschrieben, sie wird in 42 usw. geändert)? Das geht nicht ohne Getter und Setter. Manchmal ist es sinnvoll, für das zu programmieren, was Sie brauchen könnten, nicht das, was Sie gerade brauchen.


Drei Gründe:

  1. Sie können Felder in Unterklassen nicht überschreiben, wie Sie Eigenschaften können.
  2. Möglicherweise benötigen Sie eventuell einen komplexeren Getter oder Setter, aber wenn es ein Feld ist, würde das Ändern der API die API zerstören.
  3. Konvention. So ist es gemacht.

Ich bin mir sicher, dass es mehr Gründe gibt, an die ich einfach nicht denke.

In .Net 3.x können Sie automatische Eigenschaften wie folgt verwenden:

public int Age { get; set; }

anstelle der alten Schule, indem du deine privaten Felder selbst so deklarierst:

private int age;

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

Dies macht es so einfach wie das Erstellen eines Felds, aber ohne das Brechen der Änderung (unter anderem).


Es kommt darauf an?

Ich benutze immer Getter und Setter, seit sie diese Verknüpfung erstellt haben:

öffentliche int Foo {bekommen; einstellen; }

Zur Kompilierzeit ist es übersetzt. Jetzt können Sie nicht damit anfangen, aber es ist da, und wenn Sie Lust haben, werden Sie es später buchstabieren.

Wie auch immer, öffentlich, privat, geschützt ... Es kommt darauf an, wen Sie die Daten optimieren wollen. Wir verwenden Vererbung sehr und dies ist eine sehr häufige Methode für uns, so dass nur Kinder bestimmte Eigenschaften bearbeiten können.

protected _foo;  
public Foo  
{  
    get { return _foo; }
} //lack of set intentional.

In einfacheren Worten, beantworten Sie Ihre Frage ist die Zugriffsmodifikatoren dh öffentlich und privat.

Wenn du benutzt:

public int myInt;
public int MyInt 
{
     get { return myInt; }
     set { myInt = value }
}

Dann sind sowohl die MyInt-Eigenschaft als auch die myInt-Variable im zu ändernden Projekt verfügbar. Bedeutet, wenn Ihre Klasse annimmt, dass A von der Klasse angenommen wird, nehmen Sie B an, dann sind myInt und MyInt beide für die Änderung verfügbar, und es kann keine Überprüfung angewendet werden. Angenommen, Sie möchten, dass meinInt-Wert in der Ableitungsklasse gesetzt wird, wenn eine bestimmte Bedingung besteht.

Dies kann nur erreicht werden, indem Feld privat und Eigentum öffentlich gemacht wird. Damit ist nur die Eigenschaft verfügbar und Bedingungen können auf dieser Grundlage festgelegt werden.


In folgenden Fällen müssen Sie Eigenschaften verwenden:

  1. Wenn Sie Daten in der Eigenschaft zu einem bestimmten Format serialisieren müssen.
  2. Wenn Sie Eigenschaften in abgeleiteten Klassen überschreiben müssen.
  3. Wenn Sie Methoden zum Abrufen und Festlegen mit einer bestimmten Logik implementieren. Zum Beispiel, wenn Sie das Singleton-Muster implementieren.
  4. Wenn Sie von der Schnittstelle abgeleitet sind, wo die Eigenschaft deklariert wurde.
  5. Wenn Sie bestimmte Probleme im Zusammenhang mit Reflection haben.

Siehe diesen Artikel http://blog.codinghorror.com/properties-vs-public-variables/

Speziell

  • Reflection funktioniert bei Variablen und Eigenschaften anders. Wenn Sie sich also auf Reflektionen verlassen, ist es einfacher, alle Eigenschaften zu verwenden.
  • Sie können keine Daten gegen eine Variable speichern.
  • Das Ändern einer Variablen in eine Eigenschaft ist eine bahnbrechende Änderung.

Wenn Sie Silverlight verwenden, werden Sie feststellen, dass Felder nicht als statische Ressourcen definiert werden können. Daher müssen Sie eine Eigenschaft verwenden (sogar um auf eine const zuzugreifen).

Ich habe festgestellt, dass, wenn ich versuchte, die Regionsnamen zu verbinden, die ich in Composite Guidance (PRISM) verwende.

Dies ist jedoch nur eine Spracheinschränkung und abgesehen von static / const Feldern verwende ich immer Eigenschaften.


Wenn Sie einen privaten Feldnamen und eine einfache öffentliche Eigenschaft erstellen, wird der Wert des Namensfelds tatsächlich abgerufen und festgelegt

public string Name
{
   get { return name; }
}

und Sie verwenden diese Eigenschaft überall außerhalb Ihrer Klasse, und eines Tages entscheiden Sie, dass die Name- Eigenschaft dieser Klasse sich tatsächlich auf das lastName- Feld bezieht (oder dass Sie eine Zeichenfolge "My name:" + name) zurückgeben möchten Code in der Eigenschaft:

public string Name
{
   get { return lastName; //return "My name: "+name; }
}

Wenn Sie den öffentlichen Feldnamen überall im externen Code verwenden würden, müssten Sie den Namen überall dort ändern, wo Sie ihn zuletzt verwendet haben.







properties