2016-11-04 7 views
2

Ich schreibe Getter Setter in C#, ich kann in beiden Stil oder Syntax schreiben, ist ihr irgendein bestimmtes Szenario, wenn einer von ihnen zu verwenden? Encapsulation ist von beiden zu erreichen?Getter Setter Unterschiede

Beispiel 1:

public List<ChatMessage> MessageListWithoutPrivateVariable { get; set; } 

Beispiel 2:

public List<ChatMessage> MessageList { 
    set { 
    messageCollection = value; 
    } get { 
    return messageCollection; 
    } 
} 
+0

Die zweite ist das gleiche wie das, was implizit erreicht wird; also kein Grund, eins übereinander zu verwenden. Wenn andererseits etwas Interessanteres in den Get/Settern vor sich ging, dann sind die Unterschiede, Gründe und Vorteile offensichtlich. – ChiefTwoPencils

+1

Der einzige Unterschied zwischen den beiden ist, dass Sie tatsächlich einige Überprüfungen in der zweiten vornehmen können, bevor Sie die Methode get oder set direkt in der Methode selbst verwenden. –

+0

möglich duplicate von - http://stackoverflow.com/questions/8116951/any-reason-to-use-auto-implemented-properties-over-manual-implemented-properties – RBT

Antwort

5

Im Allgemeinen tun beiden Richtungen gleich. Vor C# v3.0 war die erste Möglichkeit für Programmierer nicht da. Aber Microsoft dachte, es wäre viel effizienter, wenn ein Programmierer den Kurzschriftstil wie beschrieben schreiben könnte.

In der Tat ist es nur die abgekürzte Form auch bekannt als automatisch implementierte Eigenschaften. C# generiert automatisch ein Hintergrundfeld im Hintergrund, sodass die Kapselung gewährt wird.

In einigen Szenarien benötigen Sie den zweiten Ansatz, der auch als manuelle Eigenschaften bekannt ist. Zum Beispiel, wenn Sie INotifyPropertyChanged oder einige andere Wertprüfungen im Setter verwenden möchten.

Um Ihre Frage zu beantworten: Verwenden Sie, was Sie mögen. Oder verwenden Sie den ersten Ansatz wenn möglich und den zweiten Ansatz, falls erforderlich.

0

Wie Sie sehen können, wenn Sie den folgenden Code ausführen, generiert der Compiler eine private Variable für die Variable freie Version.

using System; 
using System.Reflection; 

namespace SO40415991 
{ 
    class MyClass 
    { 
    public int MyFirstValue { get; set; } 

    private int m_mySecondValue; 
    public int MySecondValue 
    { 
     get { return m_mySecondValue; } 
     set 
     { 
     m_mySecondValue = value; 
     } 
    } 

    } 


    class Program 
    { 
    static void Main(string[] args) 
    { 
     FieldInfo[] fis = typeof(MyClass).GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); 

     foreach (var fi in fis) 
     { 
     Console.WriteLine($"{ fi.Name} {fi.IsPrivate}"); 
     } 

     Console.WriteLine(); 
     Console.WriteLine("END"); 
     Console.ReadLine(); 
    } 
    } 
} 

Es besteht keine Notwendigkeit für eine explizite private Variable ist, wenn Sie es intern in Ihnen Klasse verwenden möchten (ein Feld ist etwas schneller zugreifen als eine Eigenschaft).

0

Example 1 ist eine Kurzschrift-Syntax von Example 2 eingeführt in C# 3.0. Wenn Sie C# 2.0 codieren, sollten Sie Example 2 verwenden, aber nach 3.0 können Sie eine Kurzversion wie in Example 1 verwenden.

Wie auch immer, Sie können wie Example 2 in/nach 3.0 verwenden, wenn Sie einige Manipulation (oder) Berechnungen wie folgt tun müssen.

private List<ChatMessage> messageCollection; 

public List<ChatMessage> MessageList { 
    set { 
    messageCollection = value; 
    } get { 
    if(messageCollection == null) { 
     return new List<ChatMessage>(); 
    } else { 
     return messageCollection; 
    } 
    } 
} 
+2

Es scheint eine schlechte Idee zu sein, eine neue Liste zurückzugeben ohne dies zuerst an "messageCollection" zuzuweisen. Jemand könnte 'obj.MessageList.Add (item)' nennen und nicht das erwartete Ergebnis erhalten. –

+0

Ha ha, es ist keine Antwort, es ist ihm zu erklären, wo man die ganze Eigenschaft anstelle von Kurzschrift verwenden kann :-) – Aruna

0

{get; einstellen; } heißt "auto property", im Wesentlichen eine Kurzschrift (von Ihrem "Beispiel 2") wenn Sie schreiben {get; einstellen; } - ähnlicher Code (wie Beispiel 2) wird vom Compiler generiert.

0

Beide sind gleich, aber unterschiedlich.

, solange Sie keine zusätzliche Definition bereitgestellt werden, verhalten sich beide Darstellung gleiche, wie unter

public int weight { get; set; } 

private int _weight; 
public int weight 
{ 
    get { return _weight;} 
    set { _weight = value;} 
} 

aber, lässt das andere Szenario betrachten, was passiert, wenn Gewicht von> 40, Sie wollen etwas anderes definieren. Es kann entweder das Backing-Feld _weight ändern oder die andere private Variable (_charge) ändern.

Es macht einen großen Unterschied, wenn Sie einige Geschäftslogik auf Ihre Eigenschaft wie oben anwenden möchten.