C#4.0文法糖之第一篇:自動屬性&隱式類型

來源:互聯網
上載者:User

標籤:des   style   blog   http   使用   strong   

今天給大家分享一下C#文法糖的簡單的兩個知識點吧。

自動屬性:在 C# 4.0 和更高版本中,當屬性的訪問器中不需要其他邏輯時,自動實作屬性可使屬性聲明更加簡潔。 用戶端代碼還可通過這些屬性建立對象。 get and set accessors." id="mt3">如下面的樣本所示聲明屬性時,編譯器將建立一個私人的匿名支援欄位,該欄位只能通過屬性的 get 和 set 訪問器進行訪問。

我們C#4.0以前的傳統方式的屬性是用來封裝欄位的,這裡我簡單的對比一下這兩種方式的不同及關聯關係吧:

public class AutoProperty    {        //傳統方式定義屬性必須先定義欄位來封裝        private string name;        public string Name        {            get { return name; }            set { value = name; }        }        //自動屬性        public string LoginName { get; set; }    }

  從代碼的字數上看傳統方式的寫法比較繁瑣,自動屬性一行代碼即可實現,然後到底這兩個功能上有什麼區別呢,這裡我用反編譯工具來看了一下(反編譯工具用的是.Net Reflector 8.3),具體效果如下:

雖然我們在寫代碼是沒有寫欄位,但是編譯器幫我們自動產生欄位,然後在每個屬性的get和set訪問器在看一下會發現

//傳統方式public void set_Name(string value){    value = this.name;}public string get_Name(){    return this.name;}

  

//自動屬性[CompilerGenerated]public void set_LoginName(string value){    this.<LoginName>k__BackingField = value;}[CompilerGenerated]public string get_LoginName(){    return this.<LoginName>k__BackingField;}

  使用自動屬性注意的地方:從上面代碼上可以看出來訪問器格式基本差不多,就是自動屬性訪問器上標記為編譯器產生,然後欄位也是編譯器產生的欄位。所以傳統方式和自動屬性對於編譯去來說效果是一樣的,只不過這些繁瑣的操作編譯器幫我們產生了,以減少程式員寫的代碼和讓代碼的邏輯很清晰,很簡短。

1、            對於自動實作屬性,需要 get 和 set 訪問器。 要使該類不可變,請將 set 訪問器聲明為 private。 set accessor, you cannot use an object initializer to initialize the property." id="mt5">但是,聲明私人 set 訪問器時,不能使用對象初始值來初始化屬性。 必須使用建構函式或Factory 方法。

public string CustomerId { get; private set; }public AutoProperty(string _CustomerId)        {            this.CustomerId = _CustomerId;        }

隱式類型:可 以賦予局部變數推斷“類型”var 而不是顯式類型。 var 關鍵字指示編譯器根據初始化語句右側的運算式推斷變數的類型。 推斷類型可以是內建類型、匿名型別、使用者定義型別或 .NET Framework 類庫中定義的類型,這是微軟MSDN給出的定義,其實隱式類型簡單的理解就是程式員在聲明變數可以不用指定類型,由編譯器根據值來指定類型。2、            如果需要在屬性中有複雜的商務邏輯的話還得用傳統的屬性來實現,不管什麼東西都有它的利與弊,只要我們適當的利用即可。

理論就說怎麼多,下面咱們直接帖代碼:

public static void Test()        {             //傳統方式定義變數            string CustomerId = "客戶";            var NewCustomerId = "隱式類型";            var Age = 20;            var Array = new string[] {"111","222"};            object objectstring = "object";            Console.WriteLine("傳統類型:"+CustomerId+" "+"隱式類型"+NewCustomerId);}

從上面代碼看出來只有第一個變數是顯示定義變數,有的人看到這兒就會說這樣直接定義Object不就行了,這個有什麼好處啊,這個我剛開始也很納悶,後來我還是用反編譯工具查看了一下,在這裡我直接貼圖吧:

從上面貼圖可以看出來,隱式類型通過編譯器後會根據右側的數值自動推斷類型,但是object類型通過編譯器後還是object類型,所以這樣會出現裝箱拆箱操作,但是隱式類型沒有裝箱和拆箱操作,所以從效能上來時隱式類型是比object類型好。

使用隱式類型注意事項:

1、.必須在定義時初始化

2、一旦初始化完成,就不能再給變數賦與初始值不同類型的值了

3、var要求是局部變數

              文章原文來自:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.