2011-01-07 6 views
5

Was sind die Vorteile und Unterschiede zwischen den folgenden zwei Codierungsarten sind ...C# BestPractice: Private var und Öffentliche Getter/Setter oder öffentlichen Var

public void HelloWorld() { 

     private string _hello; 

     public string Hello {  
      get 
      { 
       return _hello; 
      } 
      set 
      { 
       _hello = value; 
      } 
     } 
} 

oder

public void HelloWorld() { 

     public string Hello { get; set; } 

} 

Meine Präferenz ist für kurzer einfacher Code, aber interessiert, Meinungen zu hören, wie ich viele Entwickler sehe, die auf dem langen Weg bestehen.

+4

Ich würde vorschlagen, den Titel in etwas wie * "Was ist der Unterschied zwischen manuell implementierten Eigenschaften und Auto-Eigenschaften" * oder so ähnlich ändern. Keines Ihrer Codebeispiele enthält eine öffentliche Variable (oder vielmehr ein Feld, wie es in diesem Fall sein sollte). –

Antwort

14

Die erste ermöglicht die Anpassung der Accessoren. Sie möchten beispielsweise den Wert im Setter validieren oder den Wert langsam in den Getter laden. Sie können auch das Hintergrundfeld readonly erstellen.

Die zweite Form erlaubt keine Anpassung (außer der Zugänglichkeit von Getter und Setter). Es ist nur ein Kurzschriftäquivalent der ersten Form.

Wenn Sie in Getter und Setter nichts Bestimmtes tun müssen, ist das zweite Formular normalerweise bequemer.

+0

Vielen Dank, dass Sie die Community an 'readonly' erinnern. –

+1

Schlechte, vernachlässigte, vergessene schreibgeschützte Eigenschaften ... – WernerCD

4

Sofern Sie einige Initialisierungen auf dem privaten Hintergrundfeld ausführen müssen oder aus einem anderen Grund benötigen, wird im Allgemeinen die prägnantere automatische Eigenschaft bevorzugt.

Also für Ihr Beispiel, wo nichts mit dem Hintergrundfeld getan wird, würde ich immer lieber die Auto-Eigenschaft verwenden.

4

Ihr zweites Beispiel ist keine öffentliche Variable, sondern eine Auto-Eigenschaft. Und eine Auto-Eigenschaft ist nur syntaktischer Zucker für Ihr erstes Beispiel.

Far als Vorteile des einen über den anderen gehen, die erste Art und Weise können Sie zusätzliche Arbeit in der Getter oder Setter (für null oder eine Eigenschaft Änderungsbenachrichtigung wie einem Scheck) tun:

private string _name; 
public string Hello {  
{ 
    get 
    { 
     if(_name == null) 
      _name = "Default Name"; 

     return _name; 
    } 
    set 
    { 
     _name = value; 
     OnPropertyChanged("Hello"); 
    } 
} 
+0

+1 für das Posten eines nützlichen Beispiels –

1

In Folgendes nehme ich an, Sie haben keine anderen Bedürfnisse wie Validierung/Nebenwirkungen.

  • Nur die ersten Arbeiten auf früheren Versionen von C#
  • Nur die erste erlaubt eine einfache Feld initialiser (statt Konstruktor)
  • Nur die erste erlaubt Attribute dem Feld solche Zugabe, als [NonSerialized]
  • zwischen den beiden Schalt können einige Serializer (BinaryFormatter zum Beispiel) brechen und Reflexion basierenden Code

Aber die {get;set;} ist prägnanter und in den meisten Fällen bevorzugt.

0

Der Unterschied, den Sie hier zeichnen, liegt zwischen der Verwendung einer expliziten Variablen zum Speichern eines Werts für eine Eigenschaft und der Verwendung einer automatisch generierten Eigenschaftsvariablen.

Es gibt viele Dinge, die Sie mit einer expliziten Variablen tun können, die Sie mit einer automatisch generierten Eigenschaftsvariablen nicht ausführen können. Sie können ihn in der Felddeklaration und nicht im Konstruktor initialisieren. Sie können es validieren. Sie können es normalisieren (wie das Trimmen der Saite usw.).

Aber wenn Sie nichts davon tun müssen, dann ist die Auto-Prop ist in Ordnung.

1

Korrigieren Sie mich, wenn ich falsch liege, aber soweit ich weiß, können Sie keine automatischen Eigenschaften debuggen. Siehe link text

Wenn Sie also einen Breakpoint auf dem Getter/Setter benötigen, benötigen Sie das ausführliche Formular.