深入 理解C#中Get和Set的使用 - TOMMYHU - 专注互联网开发及运营技术,提供相关资料及软件下载,奇趣网络时事评论!
Apr 4

深入 理解C#中Get和Set的使用 不指定

tommyhu , 19:04 , ASP.NET , Comments(0) , Trackbacks(0) , Reads(6040) , Via Original Large | Medium | Small

不知通过以上例子,你是否想通get和set的意义。
(1)变量取值和设置值,只能给它什么就是什么,一点逻辑判断也没有,而我们可以通过get和set在内部做一些处理,过滤掉一些不合理的数据,也减少异常的发生。
(2)有时,我们并不想要原模原样的变量值,可能需要对它加工的数据,如以上Grade方法,我们可以用get,当然,这种加工后的数据,是不允许用户人为改变的(是通过算法算出来的),所以不能开放给他set方法。
总之,有了get和set方法,我们调用起来才能更安全,否则,private和protected就没有意义了,因为在类我外部(包括对象调用)都无法调用到private和protected属性。如果把属性都定义成pubic,就太不安全了。
先看例子:
get set是用来扩展域的,也就是C里的变量,只是用起来更加灵活而己。看以下代码:

运行结果为:  
aaa  
dsf  
120  
也就是先把120赋值给value(相当一个存储空间),然后再用get{}返回给Book,实际上也就是一次改变变量值的过程。  
那你也许会问为什么要这么复杂呢?因为这是用了嵌套,所以可以更加方便的写入其它语句,在以后你就应该学到了。  
如果没有:  
obj.Book = 120;  
请想一想会是什么结果呢?  
只是一个取值过程:get{}而没有执行set{}  
结果为:  
dsf  
0

2.使用属性代替可访问的数据成员(出处:http://blog.csdn.net/hy_lihuan/archive/2007/12/25/1967228.aspx)
结论:只要打算将数据暴露在类型的公有接口或者受保护接口中,我们都应该使用属性来实现。对于具有序列或者字典特征的类型,则应该采用索引器。所有的数据成员都应一律声明为私有。(如果你熟悉属性语法、记住这个结论就可以了)
一、属性(property)和数据成员的基本语法:

    从上面的语法可以看到属性和数据成员在使用上是一样的,但是在定义上还是有很大的区别的;
二、属性的优点:
1、可以得到更好的数据绑定支持;数据成员则不可以
2、可以更容易地在将来对其访问方法的实现做任何改变;
3、可以更容易的在属性上进行业务逻辑的限制;
四、属性和数据成员的性能比较:几乎没有区别
    使用属性和使用数据成员在性能上有什么差别。虽然使用属性不会比使用数据成员的代码效率更快,但是它也不见得就会比使用数据成员的代码慢,因为JIT编译器会对某些方法调用(包括属性访问器)进行内联处理。如果JIT编译器对属性访问器进行了内联处理,那么属性和数据成员的效率将没有任何差别。即使属性访问器没有被内联,实际的效率差别相对于函数调用的成本来讲也是可以忽略不计的。
五、讨论和理解
个人认为属性最大的好处就是符合面向对象和语言设计的要求,做到了多处使用(调用),一次修改的原则;毕竟在项目开展的过程中,修改是不可避免的,既然不能避免,那自然就需要考虑编程方式方便修改;属性在这方面做得不错,可以通过对属性的一些限制来保证UI调用的准确性并不需要在页面中去寻找需要限制的内容;事例可以看最上面的代码,这个Name属性就要求不能为null的,如果未null就会报错;这样就不需要在每一次调用这个属性的时候进行不能为空的监测工作,减少了代码错误的可能性;
至于书上面所说的数据成员修改属性这个问题,我觉得只要养成习惯,就不要再去使用数据成员了;就算是数据成员再修改成属性也没有什么大的问题(说上说的原因是编译以后部署会花费更多的时间),对项目的修改一定是在存在问题或者更新需求的情况下,因此重新编译的必要的,所以感觉不比讲究这些。
三、属性的特点:
1、我们可以针对成员函数做的任何事情,对于属性也同样适用。
因此属性可以实现为虚属性;也可以实现为抽象属性,或者作为接口定义的一部分;
2、在C# 2.0中,我们可以为一个属性的get访问器和set访问器指定不同的访问修饰符。(可以更好地控制属性的可见性)
3、索引器(解释:http://msdn.microsoft.com/zh-cn/library/6x16t2tx(v=vs.80).aspx):索引器和一般的属性(即支持单个数据项的属性)在C#中有同样的语言支持,它们都用方法实现,我们可以在其内部做任何校验或者计算工作。索引器也可以为虚索引器,或者抽象索引器。它们可以声明在接口中,也可以成为只读索引器或者读—写索引器。以数值作为参数的“一维索引器”还可以参与数据绑定。使用非数值的索引器则可以用来定义map或者dictionary等数据结构;  
注意:在每个类型中,对于同样的参数列表,我们只能有一个索引器。


▲返回顶部
Last modified by tommyhu on2012/04/04 19:36

Add a comment

Nickname

emotemotemotemotemotemotemotemotemotemotemotemotemotemotemotemot