日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#3.0 为我们带来什么(2) —— 自动属性

發布時間:2025/3/21 C# 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#3.0 为我们带来什么(2) —— 自动属性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C#3.0 為我們帶來什么(2) —— 自動屬性

??????? public int ID { get; protected set; }
??????? public string Name { get; set; }
這是接口內聲明的屬性么?
no,這也可以是類的屬性,自動屬性。

如果說c#3.0最大的改變是什么,那就是編碼方式更人性化,程序員可以變的更懶。自動屬性也是這一特征的具體表現。
對比兩段代碼
C# 2.0

????public?class?a
????
{
????????
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) —— 自动属性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。