Frage

Kurze Frage: Wann haben Sie entscheiden Eigenschaften zu verwenden (in C #), und wenn Sie sich entscheiden, Methoden zu verwenden,

Wir sind damit beschäftigt, diese Debatte mit und haben einige Bereiche gefunden, wo es fraglich ist, ob wir eine Eigenschaft oder eine Methode verwendet werden soll. Ein Beispiel ist dies:

public void SetLabel(string text)
{
    Label.Text = text;
}

Im Beispiel ist Label ein Steuerelement auf einer ASPX-Seite. Gibt es ein Prinzip, das die Entscheidung (in diesem Fall) regeln kann, ob diese eine Methode oder eine Eigenschaft machen.

Ich werde die Antwort akzeptieren, die allgemeinste und umfassend ist, aber das berührt auch das Beispiel, dass ich gegeben haben.

War es hilfreich?

Lösung

Von dem Wahl zwischen Eigenschaften und Methoden Abschnitt von Design-Richtlinien für die Entwicklung von Klassenbibliotheken:

  

Im Allgemeinen Methoden repräsentieren Aktionen und Eigenschaften Daten darstellen. Eigenschaften sollen wie Felder verwendet werden, was bedeutet, dass Eigenschaften nicht rechnerisch komplex sein sollten oder Nebenwirkungen. Wenn es nicht die folgenden Richtlinien verstoßen, sollten Sie eine Eigenschaft verwenden, sondern als ein Verfahren, weil weniger erfahrenen Entwickler Eigenschaften leichter finden können.

Andere Tipps

Ja, wenn alles, was Sie tun bekommen und Einstellung ist, verwenden Sie eine Eigenschaft aus.

Wenn Sie etwas komplexer sind zu tun, die mehrere Datenelemente beeinflussen können, ist eine Methode besser geeignet. Oder wenn Ihr Getter nimmt Parameter oder Ihre Setter braucht mehr als einen Wert Parameter.

In der Mitte ist eine Grauzone, wo die Linie ein wenig verschwommen sein kann. Es gibt keine feste Regel, und verschiedene Leute manchmal nicht einig, ob etwas eine Eigenschaft oder eine Methode sein sollte. Das Wichtigste ist, gerecht zu sein (relativ) im Einklang mit wie Sie tut es (oder, wie Ihr Team tut es).

Sie sind weitgehend austauschbar, sondern eine Eigenschaft Signale an den Benutzer, dass die Implementierung verhältnismäßig „einfach“ ist. Oh, und die Syntax ist ein wenig saubere.

Generell meine Philosophie ist, dass, wenn Sie einen Methodennamen beginnen zu schreiben, die mit get oder setzen beginnt und dauert Null oder einen Parameter (jeweils), dann ist es ein idealer Kandidat für eine Eigenschaft.

Wenn Sie eine tatsächliche Eigenschaft des Objekts sind Setzen Sie dann eine Eigenschaft verwenden.

Wenn Sie eine Aufgabe / Funktion Leistung erbringt dann verwenden Sie eine Methode.

In Ihrem Beispiel ist eine bestimmte Eigenschaft festgelegt werden.

Wenn Sie jedoch Ihre Funktionalität AppendToLabel war dann würden Sie eine Methode verwenden.

Eigenschaften sind eine Möglichkeit, Daten von einem Objekt zu injizieren oder abgerufen werden. Sie schaffen eine Abstraktion über Variablen oder Daten in einer Klasse. Sie sind analog zu den Getter und Setter in Java.

Methoden kapseln eine Operation.

Im Allgemeinen verwende ich Eigenschaften einzelne Bits von Daten zu belichten oder kleinen Berechnungen auf einer Klasse, wie Umsatzsteuer. Die sich aus der Anzahl der Elemente und ihre Kosten in einem Einkaufswagen abgeleitet wird.

I Methoden verwenden, wenn ich eine Operation erstellen, wie Daten aus der Datenbank abgerufen werden. Jede Operation, die beweglichen Teile hat, ist ein Kandidat für ein Verfahren.

In Ihrem Code Beispiel würde ich es in einer Eigenschaft wickeln, wenn ich es brauche für den Zugriff außerhalb enthalten ist Klasse:

public Label Title 
{
   get{ return titleLabel;}
   set{ titleLabel = value;}
}

Zur Einstellung des Textes:

Title.Text = "Properties vs Methods";

Wenn ich nur die Text-Eigenschaft des Label-Einstellung dieser ist, wie ich es tun würde:

public string Title 
{
   get{ return titleLabel.Text;}
   set{ titleLabel.Text = value;}
}

Zur Einstellung des Textes:

Title = "Properties vs Methods";

Die Suche in MSDN, fand ich einen Hinweis auf Eigenschaften vs Methoden dass einige große Richtlinien für die Erstellung von Methoden bestimmt:

  
      
  • Die Operation ist eine Umwandlung, wie Object.ToString.
  •   
  • Die Operation ist teuer genug, dass man auf die kommunizieren wollen   Benutzer, dass sie Caching berücksichtigen sollten   das Ergebnis.
  •   
  • einen Eigenschaftswert Abrufen der get-Accessor verwendet würde eine beobachtbare   Nebeneffekt.
  •   
  • zweimal das Mitglied Aufruf in Folge zu unterschiedlichen Ergebnissen.
  •   
  • Die Reihenfolge der Ausführung ist wichtig. Beachten Sie, dass die Eigenschaften einer Art sollte   Die Lage sein, festgelegt werden und in jedem abgerufenen   bestellen.
  •   
  • Das Mitglied ist statisch, sondern einen Wert zurückgibt, der geändert werden kann.
  •   
  • Das Element gibt ein Array. Eigenschaften, die Arrays zurückgeben kann   sehr irreführend. Normalerweise ist es   notwendig, eine Kopie der zurück   interne Array, so dass der Benutzer nicht   ändern internen Zustand. Dies, verbunden   mit der Tatsache, dass ein Benutzer leicht   annehmen, dass es eine indizierte Eigenschaft ist,   führt zu einer ineffizienten Code.
  •   

Symantically Eigenschaften sind Attribute Ihrer Objekte. Methoden sind Verhaltensweisen des Objekts ein.

Label ist ein Attribut, und es macht mehr Sinn, es eine Eigenschaft zu machen.

In Bezug auf die Objektorientierte Programmierung Sie sollten ein klares Verständnis davon haben, was Teil des Verhaltens ist und was nur ein Attribut.

Auto {Farbe, Modell, Marke}

Ein Auto hat Farbe, Modell und Marke Attribute daher ist es nicht sinnvoll ist, ein Verfahren SetColor oder setModel zu haben, weil symantically wir Auto nicht fragen ihre eigene Farbe zu setzen.

Wenn Sie also die Eigenschaft / Methode Fall mit dem realen Leben Objekt abbilden oder sie betrachten aus Symantic Sicht, wird Ihre Verwirrung wirklich weggehen.

Sie müssen nur ganz am Namen suchen ... „Eigentum“. Was heißt das? Das Wörterbuch definiert es in vielerlei Hinsicht, aber in diesem Fall „wesentlichem oder markantes Attribute oder Beschaffenheit einer Sache“ am besten paßt.

Denken Sie über den Zweck der Aktion. Sind Sie in der Tat, zu verändern oder „ein wesentliches oder unverwechselbares Attributs“ Abrufen? In Ihrem Beispiel verwenden Sie eine Funktion eine Eigenschaft einer Textbox zu setzen. Das scheint irgendwie albern, nicht wahr?

Eigenschaften wirklich sind Funktionen. Sie alle kompilieren bis getXXX () und setXXX (). Er versteckt sie nur in syntaktischem Zucker, aber es ist Zucker, der eine semantische Bedeutung für den Prozess zur Verfügung stellt.

Denken Sie über Eigenschaften wie Attribute. Ein Auto hat viele Attribute. Farbe, MPG, Modell, etc .. Nicht alle Objekte sind setable, andere sind berechenbar.

Inzwischen eine Methode ist eine Aktion. GetColor sollte eine Eigenschaft sein. GetFile () sollte eine Funktion sein. Eine weitere Faustregel, wenn es nicht den Zustand des Objekts nicht ändert, dann sollte es eine Funktion sein. Zum Beispiel sollte CalculatePiToNthDigit (n) eine Funktion sein, weil sie den Zustand der Math nicht tatsächlich ändert sich das Objekt es ist angebracht.

Dies ist weitläufig vielleicht ein bisschen, aber es wirklich läuft darauf hinaus, um zu entscheiden, was Ihre Objekte sind, und was sie darstellen. Wenn Sie nicht herausfinden können, ob es sich um eine Eigenschaft oder Funktion sein sollte, vielleicht ist es egal, welche.

Ich ziehe Eigenschaften für Add / set-Methoden verwenden, um mit 1 Parametern. Wenn Parameter mehr sind, verwenden Methoden.

Eigenschaften sollten nur einfachen Satz sein und einen Liner bekommen. Alles, was mehr und es soll wirklich ein Verfahren verschoben werden. Komplexe Code sollte immer in Methoden sein.

Ich verwende nur Eigenschaften für Variablenzugriff, das heißt immer und einzelne Variablen festlegen oder bekommen und Daten in der Kontrollgruppe zu setzen. Sobald jede Art von Datenmanipulation benötigt wird / durchgeführt, verwende ich Methoden.

Auch großes Plus für Immobilien wird dieser Wert der Immobilie kann in Visual Studio zu sehen während des Debuggen.

Eigenschaften wirklich schön sind, weil sie in dem visuellen Designer von Visual Studio zugänglich sind, sofern sie Zugang haben.

Sie verwenden werden, verwendet wurden, waren Sie nur setzen und zum Abrufen und vielleicht einige Validierung, die nicht eine erhebliche Menge an Code zugreift. Seien Sie vorsichtig, da die Erstellung komplexer Objekte bei der Validierung nicht einfach ist.

Alles andere Methoden sind die bevorzugte Art und Weise.

Es geht nicht nur um Semantik. Mit Eigenschaften unangemessene Start mit Seltsamkeit treten in den Visual Studio Visual Designer.

Zum Beispiel war ich immer einen Konfigurationswert innerhalb einer Eigenschaft einer Klasse. Die Konfigurationsklasse tatsächlich öffnet eine Datei und führt eine SQL-Abfrage den Wert dieser Konfiguration zu erhalten. Dies verursacht Probleme in meiner Anwendung, in der die Konfigurationsdatei von Visual Studio erhalten geöffnet und gesperrt würde sich eher als meine Anwendung, weil nicht nur las, sondern den Konfigurationswert (über die Setter-Methode) zu schreiben. Um dies zu beheben Ich musste es nur ein Verfahren ändern.

Als eine Frage der Designeigenschaften repräsentieren Daten oder Attribute von Klassenobjekt, während Methoden Aktionen oder Verhaltensweisen von Klassenobjekt sind.

In .NET Welt gibt es andere Auswirkungen der Verwendung Eigenschaften:

  • Die Eigenschaften werden in Datenbindung verwendet, während get_ / set_ Methoden nicht.
  • XML-Serialisierung Benutzereigenschaften wie natürlicher Mechanismus der serilization.
  • Eigenschaften zugegriffen wird von Property Steuerung und intern ICustomTypeDescriptor , die effektiv verwendet werden kann, wenn Sie eine benutzerdefinierte Bibliothek schreiben.
  • Eigenschaften werden durch Attribute , kann man es mit Bedacht Aspect Oriented Software zu entwerfen, verwenden.

Misconceptions (IMHO) über Eigenschaften Nutzung:

  • Gebraucht kleine Berechnungen zu entlarven: ControlDesigner.SelectionRules 's bekommen Block in 72 Zeilen läuft !!
  • Werden verwendet, um interne Datenstrukturen aussetzen: Auch wenn eine Eigenschaft nicht zu einem internen Datenelement abbildet, kann man es als Eigenschaft verwenden, wenn sie ein Attribut der Klasse. Viceversa, auch wenn sie ein Attribut der Klasse Eigenschaften nicht ratsam ist, zurückzukehren Array wie Datenelemente (statt Methoden verwendet werden tiefe Kopie der Mitglieder zurückzukehren.)

Im Beispiel hier geschrieben worden sein könnte, mit mehr betriebswirtschaftlichen Bedeutung wie:

public String Title
{
    set { Label.Text = text; }
}

Hier ist ein guter Satz von Richtlinien für, wenn Eigenschaften verwenden vs Methoden von Bill Wagner

  • eine Eigenschaft verwenden, wenn alle diese Bedingungen erfüllt sind: Die Getter sollte einfach und daher unwahrscheinlich sein Ausnahmen zu werfen. Beachten Sie, dass dieser Zugriff kein Netzwerk (oder Datenbank) impliziert. Entweder könnte scheitern, und daher wäre eine Ausnahme aus.
  • Sie sollten nicht haben Abhängigkeiten voneinander. Beachten Sie, dass dies eine Eigenschaft umfassen Einstellung und nachdem er eine andere beeinflussen. (Zum Beispiel würde die First-Eigenschaft wirken sich auf einen schreibgeschützten Fullname-Eigenschaft, die den Vornamen + Nachnamen Eigenschaften zusammengesetzt impliziert eine solche Abhängigkeit)
  • Sie sollten in beliebiger Reihenfolge
  • einstellbar sein
  • Der Getter keine beobachtbare Nebeneffekt Hinweis haben diese Richtlinie nicht einige Formen von lazy evaluation nicht entgegensteht, in einer Eigenschaft.
  • Die Methode muss immer sofort zurück. (Beachten Sie, dass dies eine Eigenschaft ausschließt, die einen Zugriff auf die Datenbank Anruf tätigt, Web-Service-Aufruf oder eine ähnliche Operation).
  • Verwenden eines Verfahrens, wenn das Element ein Array zurückgibt.
  • Wiederholte Anrufe an den Getter (ohne Code dazwischen) sollten den gleichen Wert zurück.
  • Die wiederholten Aufrufe an die Setter (mit dem gleichen Wert) soll keinen Unterschied von einem einzigen Anruf erhalten.

  • Die get sollte nicht einen Verweis auf interne Datenstrukturen zurückzukehren (siehe Punkt 23). Ein Verfahren könnte eine tiefe Kopie zurück und konnte dieses Problem vermeiden.

* Genommen von meiner Antwort auf eine doppelte Frage.

Das ist ganz einfach.

1: Verwendung Eigenschaft, wenn Sie Ihre Daten möchten, sollten vor der Lagerung im Feld validiert werden. So in dieser Art und Weise Eigenschaft bietet Verkapselung für Ihre Felder. Denn wenn Sie Ihre Felder öffentlichen Endbenutzers verlassen kann einen beliebigen Wert zuweisen, die nicht nach Ihren geschäftlichen Anforderungen wie Alter sein kann oder gelten sollte größer als 18 sein Also, bevor Wert entsprechende Speicherfeld wir überprüfen ihre Gültigkeit benötigen. Auf diese Weise Eigenschaften repräsentieren Daten.

2: Verwenden Sie die Methode, wenn Sie eine Aktion ausführen möchten, wie Sie einige Daten als Parameter und Ihre Methode liefern wird eine Verarbeitung auf der Grundlage der gelieferten Werte zu tun und verarbeiteten Wert als Ausgabe zurück. Oder Sie wollen durch diese Berechnung Wert eines Feldes ändern. „Auf diese Weise Methode stellt Aktion“.

Ich komme aus Java einer i verwendet get .. gesetzt .. Methode für eine Weile.

Wenn ich Code schreiben, ich frage nicht zu mir selbst: „Zugriff auf diese Daten ist einfach oder einen schweren Prozess erfordern?“ , weil die Dinge ändern können, (heute retrive diese Eigenschaft einfach ist, kann tomonrow einig oder schweren Prozess erfordern).

Heute habe ich eine Methode SetAge (int age) tomonrow i auch Verfahren SetAge haben (Datum Geburtsdatum), die das Alter mit der birth berechnen.

war ich sehr enttäuscht, dass die Compiler-Eigenschaft in get transformieren und gesetzt, aber nicht der Ansicht, meint ... und Set .. Methoden als das gleiche.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top