设为首页|收藏本站|
开启左侧

[职场] 关于“属性”的几个问题,也许面试会问到哦

[复制链接]
15539 0
山水伞业 发表于 2019-7-15 10:18:35 | 只看该作者 打印 上一主题 下一主题
 
这篇我们继续聊聊“属性”,大家都知道,属性其实分两种,无参属性和有参属性,顾名思义

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

关于“属性”的几个问题,也许面试会问到哦 第1张图片



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

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

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

A: 一般来说,一个类中都存在一个描述类的状态数据,我们也可以认为是元数据,这些元数据是不可以被轻易修改的,一旦被错误的修改,就会导致类的破坏,所以建议在字段中加一层壳,由属性来提供高层访问。

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

关于“属性”的几个问题,也许面试会问到哦 第2张图片


Q: 我看到上面字段age和属性Age,那么请问自动属性有封装字段吗,比如下面的代码?


关于“属性”的几个问题,也许面试会问到哦 第3张图片


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


关于“属性”的几个问题,也许面试会问到哦 第4张图片


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

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


关于“属性”的几个问题,也许面试会问到哦 第5张图片


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


关于“属性”的几个问题,也许面试会问到哦 第6张图片


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

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

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

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

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

关于“属性”的几个问题,也许面试会问到哦 第7张图片


关于“属性”的几个问题,也许面试会问到哦 第8张图片


Q:从上图中看到索引器本质上是get_Item,set_Item,但是我如果自己手工定义了一个get_Item造成方法名冲突了,这个怎么办?


关于“属性”的几个问题,也许面试会问到哦 第9张图片


关于“属性”的几个问题,也许面试会问到哦 第10张图片


A: 这个问题也是蛮有意思的,最常见的做法就是手工修改我们自己定义的方法名,但是我们这里可不可以另辟蹊径呢?我们在写WCF的时候,可能会遇到给方法标记别名的情况,然后我们就用OperationContract给方法换一个名字,现在估计就有人想到了我是不是也可以给“索引器”加上别名?确实可以这样,在这里我们可以用IndexerName来完成。


关于“属性”的几个问题,也许面试会问到哦 第11张图片


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

关于“属性”的几个问题,也许面试会问到哦 第12张图片


转发评论有惊喜哦


下一篇:客服工作人员 Part-time type
@



1.西兔生活网 CTLIVES 内容全部来自网络;
2.版权归原网站或原作者所有;
3.内容与本站立场无关;
4.若涉及侵权或有疑义,请点击“举报”按钮,其他联系方式或无法及时处理。
 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

排行榜
活跃网友
返回顶部快速回复上一主题下一主题返回列表APP下载手机访问
Copyright © 2016-2028 CTLIVES.COM All Rights Reserved.  西兔生活网  小黑屋| GMT+8, 2024-6-17 10:06