Müssen Eigenschaften in C # viel Arbeit leisten?

8

Wenn eine Eigenschaft gelesen oder zugewiesen wird, würde man nicht erwarten, dass sie viel Arbeit verrichtet. Wenn die Methoden setSomeValue(...) und getSomeValue(...) verwendet werden, sollte man nicht so überrascht sein, dass unter der Haube etwas nicht-triviales passiert. Jetzt, da C # die Welt Eigenschaften gegeben hat, erscheint es albern, Getter- und Setter-Methoden zu verwenden. Was ist deine Meinung dazu? Soll ich dieses Q als Community-Wiki markieren?

Danke.

BEARBEITEN:

In meinem Fall ist es nicht teuer, es aufzurufen, aber es löst das Setzen einer verwandten Eigenschaft in einer anderen Klasse und möglicherweise das Schreiben einer kurzen Nachricht in eine Protokolldatei aus (wenn die URL leer ist). Ist das zu viel Arbeit für eine Immobilie? Was ist die Alternative?

    
Hamish Grubijan 06.05.2010, 22:26
quelle

10 Antworten

18
  

Aber jetzt, da C # der Welt gegeben hat   Eigenschaften, es scheint albern zu verwenden   Getter- und Setter-Methoden statt.

Bevor Sie darüber nachdenken, wie teuer Eigenschaften sein sollten, würde ich Ihnen raten, darüber nachzudenken, ob das Konzept, das Sie modellieren, am besten als "Eigenschaft von etwas" dargestellt wird. Eigenschaften existieren in der Sprache zum Ausdruck Zuordnung anderer Entitäten - Wenn SomeValue nicht logisch eine Eigenschaft des Typs ist, zu dem es gehört, sollten Sie stattdessen die Verwendung von Getter / Setter-Methoden in Betracht ziehen.

  

Sollten Eigenschaften in C # viel bewirken   der Arbeit?

Nachdem dies gesagt wurde, hilft es, Eigenschaften möglichst kostengünstig zu machen. Die meisten Entwickler erwarten, dass Eigenschaften effiziente Wrapper um einen internen Zustand des Typs sind, zu dem sie gehören. Wenn diese Erwartung verletzt wird, wird es für Entwickler schwieriger, leistungsfähigen Code zu schreiben, der die Eigenschaft verwendet. Wenn zum Beispiel eine Eigenschaft als Bedingung einer for -Schleife verwendet wird, wird sie bei jeder Iteration ausgewertet - wenn sie teuer ist ... nun, das kann schlecht sein.

Auf Eigenschaften wird auch häufig im Debugger zugegriffen - Sie möchten nicht, dass Eigenschaften teure Logik ausführen, da dies das Debugging verhindern kann. Property-Getter, die Operationen mit Nebeneffekten durchführen (wie zum Beispiel das Abfragen einer Datenbank), sind in der Regel ebenfalls eine schlechte Übung, da sie Heisenbugs einführen können beim Überprüfen des Verhaltens einer Anwendung im Debugger.

  

Was ist die Alternative?

Sie können das auch in nachlesen Antwort , die einige gute allgemeine Richtlinien für das Property Design bietet. Ich empfehle Ihnen auch, Auswählen von Eigenschaften und Methoden in den .NET-Designrichtlinien auf MSDN zu lesen .

Manchmal ist es sinnvoll, eine Eigenschaft zu erstellen, die schreibgeschützt ist (kein Setter), aber eine oder mehrere separate Methoden existieren, die den internen Status für diese Eigenschaft festlegen. Ob dieses Idiom verwendet wird, hängt davon ab, ob die Operationen für Ihr Objekt semantisch als "Status ändern" oder "Aktivität ausführen" verfügbar gemacht werden. Wenn es das Spätere ist, neige ich dazu, Methoden (anstatt Property Setter) zu verwenden, um dieses Verhalten auszudrücken.

    
LBushkin 06.05.2010, 22:34
quelle
4

Die allgemeine Faustregel lautet, dass Eigenschaften nicht teuer sein sollten. Wenn sie teuer zu nennen sind, machen Sie sie stattdessen zu einem Getter. Dies kann nicht immer befolgt werden, Sie müssen definitiv ein Urteil fällen.

    
Matt Greer 06.05.2010 22:29
quelle
3

Die genaue Menge von zu viel Arbeit ist strittig. Die beste Antwort ist, dass Eigenschaften eher weniger Arbeit leisten sollten als mehr Arbeit:)

Eine Sache, die Get Properties niemals machen sollten ist, den Status des Objekts zu ändern.

    
Igor Zevaka 06.05.2010 22:34
quelle
2

Die Person, die die von Ihnen erstellte Klasse verwendet, hat keine Ahnung, was die Implementierung ist. Er könnte User.ID immer wieder verwenden, ohne zu wissen, dass es sich um einen DB-Aufruf handelt.
Sie sehen, 99% der Zeit, Eigenschaften sind nichts anderes als Variablen mit einer zusätzlichen Codezeile im besten Fall, so dass Entwickler sie als solche behandeln. Es wird als gute Praxis angesehen, eine Eigenschaft in eine Methode umzuformen, wenn sie in irgendeiner Weise teuer ist. Sie wissen nie, was eine Methode versteckt, und (gute) Entwickler sparen beim Aufrufen von Methoden, wenn sie Ergebnisse aus früheren Aufrufen zwischenspeichern können.

    
Rubys 06.05.2010 22:34
quelle
2
  

Methoden stattdessen verwendet werden, sollte man nicht so überrascht sein, dass etwas nicht-triviales unter der Haube gehen könnte

aufgrund von Eigenschaften ist nur eine syntaktische Zucker über genau die gleichen Set ... und Get ... Methoden (die von Compiler erzeugt, wenn IL gemacht wird) - es gibt keinen Unterschied. Wenn Sie etwas Logik in SetFoobar implementieren würden - tun Sie es in Foobar {set {...}} auch

    
zerkms 06.05.2010 22:33
quelle
1

Nein, Eigenschaften sollten nicht viel Arbeit verrichten ...

    
eglasius 06.05.2010 22:28
quelle
1

"Sollten" sie? Das ist eine matschige Frage.

Das können sie sicherlich, und es gibt nicht viele Gründe dafür. Stack-Überläufe sind ein guter Grund, eine Menge Arbeit in einem Property Accessor zu vermeiden, aber wenn Ihr Code anderweitig lesbar ist und Ihre Absicht leicht zu kommunizieren ist, gibt es keine feste Regel, die das nicht sagt.

    
andrewbadera 06.05.2010 22:29
quelle
1

Eigenschaften sind wirklich nur syntaktischer Zucker . Als Best Practice möchte ich sie sehr einfach halten und nicht viel Code in sie stecken. Dafür gibt es jedoch keinen technischen Grund. Am Ende sind es nur Funktionen, die ausgeführt werden. Was Sie fragen müssen, wenn Sie sie verwenden, ist, was für diejenigen, die nach Ihnen kommen, am meisten wartbar und intuitiv ist.

    
Jason Webb 06.05.2010 22:31
quelle
1

Als Benutzer einer Klasse erwarte ich , dass Eigenschaften nicht teuer sind - da der Name impliziert, dass sie nur einen Wert eines Objekts erhalten / setzen. Im Gegensatz dazu, wenn ich eine Methode für ein Objekt anrufe, ist mir bewusst, dass es " etwas tun " und möglicherweise teuer ist.

Eine Sache, die für Eigenschaften immer zutreffen sollte, ist, dass property-getter frei von Nebenwirkungen sein sollte . Z.B. Ein Property-Getter sollte denselben Wert zurückgeben, auch wenn ich ihn 10 Mal hintereinander nenne. Dies ist am besten sichtbar, wenn Sie diese Verwendung einer Eigenschaft sehen:

%Vor%     
M4N 06.05.2010 22:39
quelle
1

Ich denke, die beste Regel ist, dass sie keine Exceptions werfen dürfen und auch keine Nebenwirkungen haben. Wenn Sie beispielsweise den Getter aufrufen und nichts anderes ändert, sollte sich der zurückgegebene Wert nicht ändern. Beachten Sie, dass 'DateTime.Now' nicht dieser Regel folgt, aber wahrscheinlich sollte.

    
Sander Rijken 06.05.2010 22:33
quelle

Tags und Links