2011-09-06 45 views
8

可能重複:
What's the difference between encapsulating a private member as a property and defining a property without a private member?C#,物業之間的差異變和不變量

我知道屬性和基本功能。但是當我縱深瀏覽文檔時,我發現他們只是在獲取集合並且沒有變量的情況下聲明的。

什麼是這兩個

public int EmpCode 
{ 
    get { return _strEmpCode; } 
    set { _strEmpCode = value; } 
} 

public int EmpCode 
{ 
    get; 
    set; 
} 

之間的diffeence這是否只是一種書寫的更簡單的方法,其得到的.NET框架升級了。還是有任何功能差異?

回答

6

後來被稱爲自動屬性,是same.They在C#3進行了介紹,你可以閱讀更多關於他們在這裏:http://trashvin.blogspot.com/2008/05/automatic-properties-and-object.html

簡而言之,自動屬性是語法糖,因此開發人員必須輸入較少的代碼,編譯器會爲你生成私有字段和公共setter和getter。

+0

這是適用於所有數據類型的縮寫嗎? –

+0

@Nithesh Hebri - 事實確實如此。 –

+0

它包含在.net framework 3.5中? –

3

這被稱爲自動屬性。沒有功能差異。後者的語法只是前者的縮寫。

C# specification的10.7.3節給出了更詳細地:

當屬性被指定爲自動執行屬性,一個隱藏的後備字段是自動提供的屬性,並且訪問器被實現爲讀來自並寫入該支持領域。

下面的例子:

public class Point { 
    public int X { get; set; } // automatically implemented 
    public int Y { get; set; } // automatically implemented 
} 

等效於以下聲明:

public class Point { 
    private int x; 
    private int y; 
    public int X { get { return x; } set { x = value; } } 
    public int Y { get { return y; } set { y = value; } } 
} 
+1

沒有功能差異,但是如果你要序列化自動道具,你會得到令人困惑的名字作爲後備字段,這可能是非常煩人的 – vittore

0

這就是所謂的自動性能和僅僅是一個,如果將它們寫的更簡單的方法你不需要任何財產內的邏輯。編譯時,編譯器會爲屬性自動生成一個支持變量,因此它完全一樣。

可以很容易地將財產轉爲與支持字段和一些邏輯屬性以後,這將突破依賴於該財產的任何代碼,如果你不是僅僅使用了公共領域的第一,然後改它成爲一個屬性,你會打破依賴此字段/屬性的代碼。

+0

這是適用於所有數據類型的簡寫形式嗎? –

+0

@Nithesh Hebri - 事實確實如此。 –

0

有這樣功能沒有差異..但是如果你想要更多的功能在你的屬性設置/讓你可以使用與私有變量版本..

public int EmpCode 
    { 
     get { return _strEmpCode > 0 ? 100 + _strEmpCode : 0; } 
     set 
     { 
      if (value > 0) 
       _strEmpCode = value; 
     } 
    } 

否則,你可以簡單地使用版本沒有私有變量。

0

第二種方式實際上是auto-property,它隱含地實現了後臺字段,這意味着你不能影響生成的字段名稱。

大多數時候你並不關心,但是在使用序列化/反序列化在層之間傳遞對象的情況下,在某些情況下,您會顯式創建後臺字段,以便除去__propBackingField2735t34上的名稱客戶。

另外,在顯式編碼特性進行驗證一些邏輯可以包括其不是,私人支持字段被自動創建的autoproperites

0

這是從C#3.0增強其被稱爲自動實現的屬性的情況下編譯器在後臺