[C#6] 5-自動屬性增強

來源:互聯網
上載者:User

標籤:

0. 目錄

C#6 新增特性目錄

1. 老版本代碼
 1 internal class Person 2 { 3     public string Name { get; private set; } 4     public int Age { get; private set; } 5  6     public Person(string name,int age) 7     { 8         Name = name; 9         Age = age;10     }11 }

通常情況下,C#的屬性可以很好的協助我們完成工作,比如上面的代碼。在為屬性賦值的時候,我們可以在任意地方為其賦值。但是並沒有一種像是欄位一樣的聲明且立即初始化的文法來簡化預設值的設定。C#6為我們帶來了這種新的文法,像是為欄位賦值一樣為屬性賦值。

我們也知道,C#的屬性實際上是一個編譯器自動產生的私人欄位、get_xxx和set_xxx、一條中繼資料組成,比如上面的代碼編譯後:

<Name>k__BackingField欄位的IL

1 .field private string ‘<Name>k__BackingField‘2 .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) 3 .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 )

表示一個私人欄位,第2行分別表示這個自動是編譯器自動產生的,第3行表示該欄位不顯示在Debugger視窗中。

 

get_Name方法的IL:

 1 .method public hidebysig specialname instance string  2         get_Name() cil managed 3 { 4   .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )  5   // Code size       7 (0x7) 6   .maxstack  8 7   IL_0000:  ldarg.0 8   IL_0001:  ldfld      string csharp6.Person::‘<Name>k__BackingField‘ 9   IL_0006:  ret10 } // end of method Person::get_Name

這也是一個自動產生的方法。

 

set_Name方法的IL:

 1 .method private hidebysig specialname instance void  2         set_Name(string ‘value‘) cil managed 3 { 4   .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )  5   // Code size       8 (0x8) 6   .maxstack  8 7   IL_0000:  ldarg.0 8   IL_0001:  ldarg.1 9   IL_0002:  stfld      string csharp6.Person::‘<Name>k__BackingField‘10   IL_0007:  ret11 } // end of method Person::set_Name

同樣是一個自動產生的方法。

 

Name屬性的IL:

1 .property instance string Name()2 {3   .get instance string csharp6.Person::get_Name()4   .set instance void csharp6.Person::set_Name(string)5 } // end of property Person::Name

表示Name屬性由一個get方法和set方法組成。

2. 自動屬性增強文法
 1 internal class Person 2 { 3     //聲明讀寫屬性、且初始化預設值 4     public string Name { get; set; } = "blackheart"; 5  6     //聲明唯讀屬性、且初始化預設值 7     public int Age { get; } = 1; 8  9     //聲明唯讀屬性10     public string Note { get; }11 12     public Person(string note)13     {14         //在構造器中為唯讀屬性初始化預設值15         Note = note;16     }17 18     private void func1()19     {20         //error,只能在構造器中初始化21         //Note = "123";22         //Age = 1;23         //可以修改,因為有set訪問器24         Name = "new name";25     }26 }

這種新文法會在沒有set訪問器的時候把隱藏的私人欄位設定為唯讀欄位(readonly ),只允許在聲明的時候設定初始值或者在構造器裡面賦值。看看IL:

只有Name屬性具有set_Name方法,而Age和Note屬性則沒有set訪問器,且對應的私人欄位被設定為"initonly",表示這是一個唯讀欄位。

構造器方法,Name{get;set;}="blackheart"和Age{get;}=1的初始化操作部分被轉移到執行個體建構函式".ctor"方法中。

 1 .method public hidebysig specialname rtspecialname  2         instance void  .ctor(string note) cil managed 3 { 4   // Code size       34 (0x22) 5   .maxstack  8 6   IL_0000:  ldarg.0 7   IL_0001:  ldstr      "blackheart" 8   IL_0006:  stfld      string csharp6.Person::‘<Name>k__BackingField‘ 9   IL_000b:  ldarg.010   IL_000c:  ldc.i4.111   IL_000d:  stfld      int32 csharp6.Person::‘<Age>k__BackingField‘12   IL_0012:  ldarg.013   IL_0013:  call       instance void [mscorlib]System.Object::.ctor()14   IL_0018:  nop15   IL_0019:  nop16   IL_001a:  ldarg.017   IL_001b:  ldarg.118   IL_001c:  stfld      string csharp6.Person::‘<Note>k__BackingField‘19   IL_0021:  ret20 } // end of method Person::.ctor

和之前的文法產生的程式碼可以說是一致的,均是產生為一個欄位、get_xxx和set_xxx方法和對應的屬性中繼資料,本質依然是編譯器的文法簡化。

3. 參考

C# Auto-property enhancements

[C#6] 5-自動屬性增強

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.