第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

關(guān)于“屬性”的幾個(gè)問(wèn)題

標(biāo)簽:
資訊

 

       这些天太忙了都没更新博客了,这篇我们继续聊聊“属性”,大家都知道,属性其实分两种,无参属性和有参属性,顾名思义

无参属性就是我们平时用到的 “属性”,有参属性就是我们所说的 “索引器”,

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

乍一看这两个还是蛮像的,本质上来说这两个都是getXXX,setXXX方法,只是编译器为了提高我们的开发效率而做的语法糖。

好,下面回答几个小问题,当然是我自己的个人见解。

 

Q:为什么类型中要存在属性?

A: 一般来说,一个类中都存在一个描述类的状态数据,我们也可以认为是元数据,这些元数据是不可以被轻易修改的,一但

      被错误的修改,就会导致类的破坏,所以建议在字段中加一层壳,由属性来提供高层访问。

   举个例子:Person的Age字段不能设为<0 || >150的非法数据,这个时候我们就可以在属性的set方法上进行过滤了。

复制代码

 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,那么请问自动属性有封装字段吗,比如下面的代码?

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

 

A:其实这个问题问的好,如果你是平时用用而没有用IL看一下的话,可能还真被蒙到了,既然说到了IL,那就用IL看一下。

从IL上可以清楚的看到其实编译器给我们生成了一个私有的k__BackingField 字段。

 

Q: 提到属性,我想问一下“类型初始化器”和“构造函数”有什么区别。

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

 

A: 要看有没有区别,我们得要看到底这个“类型初始化器”到底干了些什么?老规矩,我们看看IL代码。

从IL上可以看出,两个nop之间,我们调用了构造函数(ctor),并且先后调用了set_Name,set_Age方法,所以本质上来说,

“类型初始化器”只是一个语法糖,跟我们手工在构造函数中初始化一样。

 

Q:我经常看到Session["xxx"],Cookie["xxx"],请问索引器只能用到类的实例上吗?可不可以

     用到类型上?

A:这个问题问的好,其实你可以发现,我们在定义一个索引器的时候,根本就没有定义索引器的名字,而是直接用this,重点

    就在这里,我们知道this表示当前实例的上下文,导致我们的[]只能用到类型的实例上,也就做不了将[]用到类型上。

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

 

Q:从上图中看到索引器本质上是get_Item,set_Item,但是我如果自己手工定义了一个

   get_Item造成方法名冲突了,这个怎么办?

复制代码

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

复制代码

 

A: 这个问题也是蛮有意思的,最常见的做法就是手工修改我们自己定义的方法名,但是我们这里可不可以另辟蹊径呢?我们在写

      WCF的时候,可能会遇到给方法标记别名的情况,然后我们就用OperationContract给方法换一个名字,现在估计就有人想到

     了我是不是也可以给“索引器”加上别名?确实可以这样,在这里我们可以用IndexerName来完成。

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

 

然后我们再看看IL代码,就这样成功的修改了索引器的方法名。

 

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶(hù)
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專(zhuān)欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消