C#3.0 为我们带来什么(2) —— 自动属性
生活随笔
收集整理的這篇文章主要介紹了
C#3.0 为我们带来什么(2) —— 自动属性
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C#3.0 為我們帶來什么(2) —— 自動屬性
????{
????????private?int?_id;
????????private?string?_name;
????????public?int?ID
????????{
????????????get
????????????{
????????????????return?_id;
????????????}
????????????protected?set
????????????{
????????????????_id?=?value;
????????????}
????????}
????????public?string?Name
????????{
????????????get
????????????{
????????????????return?_name;
????????????}
????????????set
????????????{
????????????????_name?=?value;
????????????}
????????}
????????public?a(int?id)
????????{
????????????this._id?=?id;
????????}
????}
C# 3.0
????public?class?b
????{
????????public?int?ID?{?get;?protected?set;?}
????????public?string?Name?{?get;?set;?}
????????public?b(int?id)
????????{
????????????this.ID?=?id;
????????}
????} 在c#中是推薦使用屬性來代替public 變量的。我們在項目中也盡量將需要公開的字段定義為屬性,代之而來的就是上面代碼的冗繁。不管你對這個屬性有沒有特殊處理,都需要先定義一個私有變量,并將其在get,set方法中返回或賦值。使得代碼量大量增加,閱讀難度也增加。
隨3.0而來的自動屬性使我們可以方便的定義一個簡單屬性(不需要對field進行特殊處理的),他所使用的私有變量由系統來生成。工作量減少,閱讀難度降低。
下面來看看編譯器到底為我們做了什么。
使用IL Disassembler來看看到底發生了什么。
可以看到除了私有變量的地方不同外其它的都是一樣的。
看看這倆變量的定義有什么不同。
c# 2.0
.field private int32 _id
c# 3.0:
.field private int32 '<ID>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
反射?
msdn對CompilerGeneratedAttribute是這樣描述的。
Distinguishes a compiler-generated element from a user-generated element. This class cannot be inherited.
區分編譯器生成的元素與用戶生成的元素。無法繼承此類。
其意思就是上面兩端IL代碼沒什么不同,不過是第二個里的私有變量標記了是編譯器生成的而已。
再來看看兩個個set_Name
c#2.0
.method public hidebysig specialname instance void
??????? set_Name(string 'value') cil managed
{
? // 代碼大小?????? 9 (0x9)
? .maxstack? 8
? IL_0000:? nop
? IL_0001:? ldarg.0
? IL_0002:? ldarg.1
? IL_0003:? stfld????? string WindowsFormsApplication1.a::_name
? IL_0008:? ret
} // end of method a::set_Name
c#3.0:
.method public hidebysig specialname instance void
??????? set_Name(string 'value') cil managed
{
? .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
? // 代碼大小?????? 8 (0x8)
? .maxstack? 8
? IL_0000:? ldarg.0
? IL_0001:? ldarg.1
? IL_0002:? stfld????? string WindowsFormsApplication1.b::'<Name>k__BackingField'
? IL_0007:? ret
} // end of method b::set_Name
不同也不過是多了一句話
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
好了現在放心了,大膽使用吧。
自動屬性最終帶給我們的應該是兩種方式交融的編碼方式
????public?class?b
????{
????????private?int?_age;
????????public?int?ID?{?get;?protected?set;?}
????????public?string?Name?{?get;?set;?}
????????public?int?Age
????????{
????????????get
????????????{
????????????????return?_age;
????????????}
????????????set
????????????{
????????????????if?(value?<?0?||?value?>?120)
????????????????????new?Exception("年齡超出范圍。");
????????????????else
????????????????????_age?=?value;
????????????}
????????}
????????public?b(int?id)
????????{
????????????this.ID?=?id;
????????}
????}
(小弟才疏學淺,歡迎各位看客指正錯誤。)
posted on 2008-01-06 16:37 tianyamoon 閱讀(...) 評論(...) 編輯 收藏
??????? public int ID { get; protected set; }
??????? public string Name { get; set; }
這是接口內聲明的屬性么?
no,這也可以是類的屬性,自動屬性。
如果說c#3.0最大的改變是什么,那就是編碼方式更人性化,程序員可以變的更懶。自動屬性也是這一特征的具體表現。
對比兩段代碼
C# 2.0
????{
????????private?int?_id;
????????private?string?_name;
????????public?int?ID
????????{
????????????get
????????????{
????????????????return?_id;
????????????}
????????????protected?set
????????????{
????????????????_id?=?value;
????????????}
????????}
????????public?string?Name
????????{
????????????get
????????????{
????????????????return?_name;
????????????}
????????????set
????????????{
????????????????_name?=?value;
????????????}
????????}
????????public?a(int?id)
????????{
????????????this._id?=?id;
????????}
????}
C# 3.0
????public?class?b
????{
????????public?int?ID?{?get;?protected?set;?}
????????public?string?Name?{?get;?set;?}
????????public?b(int?id)
????????{
????????????this.ID?=?id;
????????}
????} 在c#中是推薦使用屬性來代替public 變量的。我們在項目中也盡量將需要公開的字段定義為屬性,代之而來的就是上面代碼的冗繁。不管你對這個屬性有沒有特殊處理,都需要先定義一個私有變量,并將其在get,set方法中返回或賦值。使得代碼量大量增加,閱讀難度也增加。
隨3.0而來的自動屬性使我們可以方便的定義一個簡單屬性(不需要對field進行特殊處理的),他所使用的私有變量由系統來生成。工作量減少,閱讀難度降低。
下面來看看編譯器到底為我們做了什么。
使用IL Disassembler來看看到底發生了什么。
可以看到除了私有變量的地方不同外其它的都是一樣的。
看看這倆變量的定義有什么不同。
c# 2.0
.field private int32 _id
c# 3.0:
.field private int32 '<ID>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
反射?
msdn對CompilerGeneratedAttribute是這樣描述的。
Distinguishes a compiler-generated element from a user-generated element. This class cannot be inherited.
區分編譯器生成的元素與用戶生成的元素。無法繼承此類。
其意思就是上面兩端IL代碼沒什么不同,不過是第二個里的私有變量標記了是編譯器生成的而已。
再來看看兩個個set_Name
c#2.0
.method public hidebysig specialname instance void
??????? set_Name(string 'value') cil managed
{
? // 代碼大小?????? 9 (0x9)
? .maxstack? 8
? IL_0000:? nop
? IL_0001:? ldarg.0
? IL_0002:? ldarg.1
? IL_0003:? stfld????? string WindowsFormsApplication1.a::_name
? IL_0008:? ret
} // end of method a::set_Name
c#3.0:
.method public hidebysig specialname instance void
??????? set_Name(string 'value') cil managed
{
? .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
? // 代碼大小?????? 8 (0x8)
? .maxstack? 8
? IL_0000:? ldarg.0
? IL_0001:? ldarg.1
? IL_0002:? stfld????? string WindowsFormsApplication1.b::'<Name>k__BackingField'
? IL_0007:? ret
} // end of method b::set_Name
不同也不過是多了一句話
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
好了現在放心了,大膽使用吧。
自動屬性最終帶給我們的應該是兩種方式交融的編碼方式
????public?class?b
????{
????????private?int?_age;
????????public?int?ID?{?get;?protected?set;?}
????????public?string?Name?{?get;?set;?}
????????public?int?Age
????????{
????????????get
????????????{
????????????????return?_age;
????????????}
????????????set
????????????{
????????????????if?(value?<?0?||?value?>?120)
????????????????????new?Exception("年齡超出范圍。");
????????????????else
????????????????????_age?=?value;
????????????}
????????}
????????public?b(int?id)
????????{
????????????this.ID?=?id;
????????}
????}
(小弟才疏學淺,歡迎各位看客指正錯誤。)
posted on 2008-01-06 16:37 tianyamoon 閱讀(...) 評論(...) 編輯 收藏
轉載于:https://www.cnblogs.com/tianyamoon/archive/2008/01/06/1027913.html
總結
以上是生活随笔為你收集整理的C#3.0 为我们带来什么(2) —— 自动属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NBear.Mapping使用教程(3)
- 下一篇: Fckeditor插入视频或视频文件