[.NET C#] 自動實作屬性

  • 1227
  • 0
  • C#
  • 2015-06-20

C#在3.0開始增加了這種語法糖的寫法,在寫作上讓code更為輕量化,由其在POCO Model屬性多的時後,更顯得這種語法的簡潔威力。

假設我們今天要建立一個Employee類別,並且具有EmpoyeeID這個int Property,照未省略前的寫法

C#在3.0開始增加了這種語法糖的寫法,在寫作上讓code更為輕量化,由其在POCO Model屬性多的時後,更顯得這種語法的簡潔威力。

假設我們今天要建立一個Employee類別,並且具有EmpoyeeID這個int Property,照未省略前的寫法:

    class Employee
    {
        public string _EmployeeID
        {
            get { return _EmployeeID; }
            set { _EmployeeID = value; }
        }
    }

而使用自動實作屬性的寫法,就能把EmployeeID相關的描省,省成一行

    class Employee
    {
        public int EmployeeID { get; set; }
    }

假設今天Employee有大約20-30個屬性,你就會發現這樣的語法跟未省略前的寫法相比,有多整潔。網路上有些討論在於,為何C#要提供這樣的功能,我想除了語法簡潔之外,也畢免了自已在key get /set時打錯回傳Field(實際上在copy /paste的時候常發生)。

看一下MSDN的描述:

"the compiler creates a private, anonymous backing field that can only be accessed through the property's get and set accessors."

實際上編輯器會幫你產生對映的私有欄位,所以效果是完成一樣的;只是差在

編輯器產生的私有欄位名稱不太相同,名稱上多了_backingField。以下以兩種寫法來作比較。

    class Employee
    {
        public string  EmpName { get; set; }
        private string _Email;
        public string Email
        {
            get { return _Email; }
            set { _Email = value; }
        }
    }

接著來看ILDASM 反組譯的結果:

實際上不同語法的EmpName及Email屬性,其邏輯是相同的。

最後,用自動實作屬性的方式,一樣可以撰寫只提供get 不提供set,或者set為private的方式。

public string EmpName { get; } //這行會有compile錯誤,自動實作屬性需要get, set成雙出現才行
public string Address { get; private set; } //將set設為private method

據說C#6.0開始可以在這種語法後面加上預設值了,看來code可以更趨精簡了。

 

參考

https://msdn.microsoft.com/zh-tw/library/bb384054.aspx

http://stackoverflow.com/questions/8116951/any-reason-to-use-auto-implemented-properties-over-manual-implemented-properties

http://huan-lin.blogspot.com/2009/01/auto-implementation-properties.html

http://blog.darkthread.net/post-2008-06-06-c-3-auto-imp-prop.aspx