国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

關(guān)于“屬性”的幾個(gè)問(wèn)題,也許面試會(huì)問(wèn)到哦~

2019-11-14 16:29:46
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

 

       這些天太忙了都沒(méi)更新博客了,這篇我們繼續(xù)聊聊“屬性”,大家都知道,屬性其實(shí)分兩種,無(wú)參屬性和有參屬性,顧名思義

無(wú)參屬性就是我們平時(shí)用到的 “屬性”,有參屬性就是我們所說(shuō)的 “索引器”,

1     public class Bird2     {3         public int Age { get; set; }4 5         public string this[int i] { get { return i + string.Empty; } set { ;} }6     }

乍一看這兩個(gè)還是蠻像的,本質(zhì)上來(lái)說(shuō)這兩個(gè)都是getXXX,setXXX方法,只是編譯器為了提高我們的開(kāi)發(fā)效率而做的語(yǔ)法糖。

好,下面回答幾個(gè)小問(wèn)題,當(dāng)然是我自己的個(gè)人見(jiàn)解。

 

Q:為什么類型中要存在屬性?

A: 一般來(lái)說(shuō),一個(gè)類中都存在一個(gè)描述類的狀態(tài)數(shù)據(jù),我們也可以認(rèn)為是元數(shù)據(jù),這些元數(shù)據(jù)是不可以被輕易修改的,一但

      被錯(cuò)誤的修改,就會(huì)導(dǎo)致類的破壞,所以建議在字段中加一層殼,由屬性來(lái)提供高層訪問(wèn)。

   舉個(gè)例子:Person的Age字段不能設(shè)為<0 || >150的非法數(shù)據(jù),這個(gè)時(shí)候我們就可以在屬性的set方法上進(jìn)行過(guò)濾了。

 1         PRivate int age; 2  3         public int Age 4         { 5             get 6             { 7                 return age; 8             } 9             set10             {11                 if (value < 0 || value > 150)12                     throw new Exception();13                 age = value;14             }15         }

 

Q:  我看到上面字段age和屬性Age,那么請(qǐng)問(wèn)自動(dòng)屬性有封裝字段嗎,比如下面的代碼?

1         public int Age2         {3             get;4             set;5         }

 

A:其實(shí)這個(gè)問(wèn)題問(wèn)的好,如果你是平時(shí)用用而沒(méi)有用IL看一下的話,可能還真被蒙到了,既然說(shuō)到了IL,那就用IL看一下。

從IL上可以清楚的看到其實(shí)編譯器給我們生成了一個(gè)私有的k__BackingField 字段。

 

Q: 提到屬性,我想問(wèn)一下“類型初始化器”和“構(gòu)造函數(shù)”有什么區(qū)別。

1             var b = new Bird { Name = "youyou", Age = 20 };

 

A: 要看有沒(méi)有區(qū)別,我們得要看到底這個(gè)“類型初始化器”到底干了些什么?老規(guī)矩,我們看看IL代碼。

從IL上可以看出,兩個(gè)nop之間,我們調(diào)用了構(gòu)造函數(shù)(ctor),并且先后調(diào)用了set_Name,set_Age方法,所以本質(zhì)上來(lái)說(shuō),

“類型初始化器”只是一個(gè)語(yǔ)法糖,跟我們手工在構(gòu)造函數(shù)中初始化一樣。

 

Q:我經(jīng)常看到session["xxx"],Cookie["xxx"],請(qǐng)問(wèn)索引器只能用到類的實(shí)例上嗎?可不可以

     用到類型上?

A:這個(gè)問(wèn)題問(wèn)的好,其實(shí)你可以發(fā)現(xiàn),我們?cè)诙x一個(gè)索引器的時(shí)候,根本就沒(méi)有定義索引器的名字,而是直接用this,重點(diǎn)

    就在這里,我們知道this表示當(dāng)前實(shí)例的上下文,導(dǎo)致我們的[]只能用到類型的實(shí)例上,也就做不了將[]用到類型上。

1         public string this[int i]2         {3             get { return i + string.Empty; }4             set { ;}5         }

 

Q:從上圖中看到索引器本質(zhì)上是get_Item,set_Item,但是我如果自己手工定義了一個(gè)

   get_Item造成方法名沖突了,這個(gè)怎么辦?

 1     public class Bird 2     { 3         public string this[int i] 4         { 5             get { return i + string.Empty; } 6             set { ;} 7         } 8  9         //重名了,這個(gè)怎么辦?10         public string get_Item(int s)11         {12             return string.Empty;13         }14     }

 

A: 這個(gè)問(wèn)題也是蠻有意思的,最常見(jiàn)的做法就是手工修改我們自己定義的方法名,但是我們這里可不可以另辟蹊徑呢?我們?cè)趯?xiě)

      WCF的時(shí)候,可能會(huì)遇到給方法標(biāo)記別名的情況,然后我們就用OperationContract給方法換一個(gè)名字,現(xiàn)在估計(jì)就有人想到

     了我是不是也可以給“索引器”加上別名?確實(shí)可以這樣,在這里我們可以用IndexerName來(lái)完成。

1         [IndexerName("Fly")]2         public string this[int i]3         {4             get { return i + string.Empty; }5             set { ;}6         }

 

然后我們?cè)倏纯碔L代碼,就這樣成功的修改了索引器的方法名。

 


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 定陶县| 长岛县| 淮阳县| 南昌市| 淮南市| 安达市| 临夏市| 新田县| 塔河县| 新泰市| 拉孜县| 濮阳市| 乐山市| 韩城市| 璧山县| 顺昌县| 平顶山市| 慈利县| 白山市| 抚松县| 山丹县| 桃园市| 大方县| 沈丘县| 隆子县| 溧阳市| 清水县| 五指山市| 广宗县| 高淳县| 邵阳市| 天镇县| 古田县| 克山县| 平远县| 南部县| 临泉县| 同德县| 长治市| 清流县| 临沂市|