2016-11-04 47 views
2

我正在用C#編寫getter setter,我可以使用樣式或語法編寫,他們是否有任何特定場景何時使用它們?封裝是從兩者中實現的?Getter setter差異

實施例1:

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

實施例2:

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

第二個與第一個隱含地實現的相同;所以沒有理由使用其中一個。另一方面,如果get/setter中有更有趣的事情發生,那麼差異,原因和好處是顯而易見的。 – ChiefTwoPencils

+1

這兩者之間的唯一區別在於,在方法本身內部使用get或set方法之前,實際上可以在第二個方法中執行一些檢查。 –

+0

可能的重複 - http://stackoverflow.com/questions/8116951/any-reason-to-use-auto-implemented-properties-over-manual-implemented-properties – RBT

回答

5

一般而言兩種方式這樣做。在C#v3.0之前,第一種可能性不適合程序員。但是微軟認爲,如果程序員能夠像你先描述的那樣寫速記風格,效率會更高。

所以實際上它只是縮寫形式,也被稱爲自動執行的屬性。 C#在後臺自動生成一個後臺字段,因此封裝被授予。

在某些情況下,您將需要第二種方法,也稱爲手動屬性。例如,如果您想在設置器中使用INotifyPropertyChanged或其他值檢查。

要回答你的問題:使用你喜歡的。或者如果可能的話使用第一種方法,如果需要使用第二種方法

0

正如你可以看到,如果你運行下面的代碼,編譯器爲變量免費版本生成一個私有變量。

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(); 
    } 
    } 
} 

,除非你想用它在內部你班有沒有必要明確地私有變量(一個場稍快比屬性訪問)。

0

Example 1是在C# 3.0中引入的Example 2的簡寫語法。如果您在C# 2.0中編碼,則應該使用Example 2,但在3.0之後,可以使用如Example 1中的簡寫形式。

無論如何,如果你需要做一些如下操作(或)計算,你可以在3.0之後使用像Example 2

private List<ChatMessage> messageCollection; 

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

這似乎是一個壞主意,返回一個新的列表而不是先將它分配給'messageCollection'。有人可能會調用'obj.MessageList.Add(item)'而不會得到他們期望的結果。 –

+0

哈哈,這不是一個答案,而是解釋他在哪裏使用完整的財產,而不是速記:-) – Aruna

0

{get;組; }被稱爲「自動屬性」,本質上是一個簡寫(你的「示例2」) 當你寫{get;組; } - 編譯器會生成類似的代碼(如例2)。

0

兩者相同但不同。

只要你不提供額外的定義,既表示行爲 一樣的,像下面

public int weight { get; set; } 

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

但是,讓我們考慮另一種情況,如果體重> 40,你要定義不同的東西是什麼。它可以修改後臺字段_weight,也可以更改其他私有變量(_charge)。

public int weight 
    { 
    get { return _weight; } 
    set 
    { 
     _weight = value; 
     if (_weight > 40) 
      _charge = _weight * 2; 
     else 
     _charge = _weight * 1; 
    } 
    } 

    private int _charge; 
    public int Charge 
    { 
    get { return _charge; } 
    set { _charge = value; } 
    } 

當你想在你的財產上應用一些業務邏輯時,它會產生巨大的差異,就像上面一樣。