2009-08-13 8 views
13

Immer wenn es Fragen zur Glaubwürdigkeit von Eigenschaften gibt, sehe ich, dass der Großteil der Diskussion um Funktionen/Methoden vs Eigenschaften passiert. Aber ich würde auch gerne wissen, den zwingenden Grund Eigenschaft zu verwenden, um mit zugehörigem privatem Bereich vs öffentlichem Bereich direkt selbst, Incase häufigsten get/set Verhalten keine anderen Verarbeitung, ich meine auf diese WeiseEigenschaft (ohne zusätzliche Verarbeitung) vs öffentlichen Feld

public string CustomerName; 

vs

private string customerName; 
public string CustomerName 
{ 
get{return customerName;} 
set(string value){this.customerName=value;} 
} 
+5

Sie können auch "öffentliche Zeichenfolge CustomerName {get; set;}" – cyberconte

Antwort

22

Sie erhalten Source/binär-Kompatibilität, wenn Sie später ein anderes Verhalten hinzufügen müssen, Sie Unterbrechungspunkte hinzufügen zu bekommen, und es ist nur philosophischer Reiniger (Pflege über das Verhalten, nicht die Speichermechanismus).

Beachten Sie, dass Sie nicht den ganzen des letzteren Block in C# 3 benötigen:

public string CustomerName { get; set; } 

Siehe my article on "Why Properties Matter" für weitere Informationen.

+0

Jon..Ich sehe Ihren Punkt. Aber irgendwie hatte ich das Gefühl, dass Code in anderer Weise sauberer wäre, d. H. Wenn es mehr Felder in der Klasse gibt (sagen wir 30+), dann wäre die Anzahl der Codezeilen mindestens viermal so groß wie bei den Eigenschaften. Jetzt machen uns automatische Eigenschaften in C# 3 und in VB 10 glücklich !!! – Raj

+7

Wenn Sie 30 Felder in Ihrer Klasse haben, sollten Sie wahrscheinlich mehr Kapselung verwenden. –

+1

Nur um zu bestätigen, ob ich die Kapselung richtig verstanden habe, logische Teilmengen der großen Felder in einer einzelnen Klasse in verschiedene Klassen/Interfaces gruppiert und diese durch Vererbung oder Komposition erhalten habe. Ist das korrekt? Wenn dies der Fall ist, würde das immer noch eine zusätzliche Menge an Code enthalten, der in verschiedenen Klassen anstatt in einer Klasse verteilt ist. Entschuldigung, wenn ich dich mit Unsinn abhöre. Dies liegt an meiner Frustration, tausende Codezeilen (mit vielen Eigenschaften ohne zusätzliche Logik) zu verwalten, die von jemand anderem geschrieben wurden. – Raj

3
  1. können Sie außer Kraft setzen oder zumindest eine „neue“ Eigenschaft in einer abgeleiteten Klasse erstellen

  2. An diesem Punkt der Menschen erwarten Eigenschaften ausgesetzt werden und Felder ausgeblendet werden. Wenn jemand über Ihre Klasse nachdenkt (es wird immer häufiger mit Tools wie Castle Windsor, NHibernate), gibt es eine Welt der Unterschiede, sie werden wahrscheinlich nicht nach exponierten Feldern suchen.

1

Sie können auch eine grundlegende Validierung mit Eigenschaften bereitstellen. Zum Beispiel eine Eigenschaft auf einen ungültigen Zustand wie ein negativer Wert für eine Höhe zu verhindern Einstellung:

private int height; 
public int Height 
{ 
    get{ return height; } 
    set 
    { 
    if (value > 0) 
    { 
     height = value; 
    } 
    } 
} 
+1

Ich stimme zu, dass jede zusätzliche Verarbeitung wie die Validierung es offensichtlich macht, Eigenschaften zu verwenden. Aus diesem Grund habe ich den Fall einer solchen zusätzlichen Verarbeitung ausdrücklich erwähnt. – Raj

2

Dies ist vor allem ein Problem in Java. In vielen anderen Sprachen (Python, Delphi, Groovy) erzeugt der Compiler die Getter und Setter für Sie , es sei denn Sie liefern den Code.

Dies bedeutet, dass Sie in Groovy ein "public" -Feld verwenden können, und der Compiler automatisch den Setter/Setter generiert und aufruft. Wenn du zusätzliche Magie anwenden musst, wenn ein Feld geändert wird, kannst du einen spezialisierten Setter einführen und alles wird funktionieren.

Es ist eines dieser Dinge, wo die Realität mit einem Design kollidiert. Die Java-Designer wollten nicht, dass der Compiler etwas tut, was Sie nicht sehen können. Was vor vielen Jahren noch eine gute Idee war, ging nicht so gut.

+0

Hinweis: Der Frage fehlte ursprünglich ein Sprach-Tag, daher wird in dieser Antwort angenommen, dass der Code in der Frage Java ist. Das Tag [tag: C#] wurde später hinzugefügt. – mklement0

2

Ich bemerke eine hilfreiche Verwendung der Eigenschaft. Wenn Sie die Auflistung Ihres Objekts an ein DataGrid- oder DataGridView-Steuerelement oder ein anderes bindbares Steuerelement binden, sind die einzigen erkannten bewertbaren Namen Property und keine öffentlichen Felder.

Verwandte Themen