又是一个语法糖,属性 = GetXXX() Set XXX() 的语法糖.
属性就是封装的方法.看CLR,看的就是去伪存真,剥离语法糖之后的C#,其实也就是那么回事.
属性分为无参属性和有参属性.性能上由于在编译的时候使用了内联技术,完全可以忽略性能损失不计.
无参属性
这种属性就是在Java或者其他语言中的Get Set方法,比如我有这么个类:
class Person { public int Age; public string Name; }
其中有年龄和姓名两个字段,我们提供get和set方法进行封装访问他们的过程,以达到保护字段安全性的作用.
class Person { int m_age; string m_name; public Person() { } public string getName() { return m_name; } public void setName(string name) { m_name = name; } public int getAge() { return m_age; } public void setAge(int age) { m_age = age; } }
为什么这么做呢?如果不使用get和set方法不也是可以访问字段的么?是的,但是我们也可以轻易的就破坏字段的安全性,比如:
Person p = new Person(); p.Age = -5; //没有人的年龄是-5,这显然是不正确的,但是我们做到了
而使用第二种get set 方式,我们就能很容易的在其中进行检测数值的正确性,以保证不会出现错误.
{
//... public void setAge(int age) { if(m_age < 0) throw new Exception("Wrong Age!"); m_age = age; } }
这个时候进行赋值操作就会抛出异常了:
Person p = new Person() p.setAge(-5); //throw Exception!!!
.Net只是将这种繁琐的过程封装了下,于是就变成了我们经常使用的属性了.本质上,编译器编译时还是会解压缩代码成为get set方法.
三个主要的原因让我们使用Get Set 方法或者属性,而不是直接暴露字段
1.希望访问或者设置字段的时候执行一些其他关联操作,比如:延迟加载,缓存取值等;
2.希望以线程安全的方式访问字段(内部手动实现);
3.字段可能只是一个逻辑值,通过计算得到,比如:有长度和宽度两个字段,只需要设置一个只读的面积属性就可以通过计算得到其值.
有参属性 ---- 索引器
我不打算讨论这块内容,我从学习C#以来从没有用到过,也很少或者说没有在其他人的代码中见识到使用索引器的.我只能说这个东西对我来说太鸡肋了,所有他能做到的,你通过方法都能做到,而且代码的可阅读性和可理解性比这个要好上N多倍.
所以归根到底,属性就是语法糖,封装了Get Set 方法,Over.