关于“属性”的几个问题,也许面试会问到哦~
2018-06-17 20:47:04来源:未知 阅读 ()
这些天太忙了都没更新博客了,这篇我们继续聊聊“属性”,大家都知道,属性其实分两种,无参属性和有参属性,顾名思义
无参属性就是我们平时用到的 “属性”,有参属性就是我们所说的 “索引器”,
1 public class Bird 2 { 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 set 10 { 11 if (value < 0 || value > 150) 12 throw new Exception(); 13 age = value; 14 } 15 }
Q: 我看到上面字段age和属性Age,那么请问自动属性有封装字段吗,比如下面的代码?
1 public int Age 2 { 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代码,就这样成功的修改了索引器的方法名。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:自己实现async和await
下一篇:C#学习系列-.NET体系结构
- python 之 并发编程(开启子进程的两种方式,进程对象的属性 2019-07-24
- 1.关于Python,你可能不知道的 2019-07-24
- Python-18-类的内置属性 2019-07-24
- 面向对象阶段复习 2019-07-24
- python(第一天) 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash