.net 基础之属性
会使用属性已经好长时间了,但是不知道为什么要使用属性,使用属性能带来什么好处
如果我们定义了一个Person类
public class Person { public string name; public Int32 age; public Person(string name,Int32 age) { this.name = name; this.age = age; } }
当我们在类中这样定义了字段之后。在使用一个这个类型的一个引用的时候我们可能会写出这样的代码
Person person = new Person(); person.age = -5;
这样的代码写出来之后没有编译错误,但是这是非常不符合实际情况的一个人的年龄怎么能够使-5呢??
public class Person { private string name; private Int32 age; public void Set_Name(string name) { this.name = name; } public String Get_Name() { return name; } public void Set_Age(Int32 age) { if(age < 0) { throw new ArgumentException("value",age.ToString(),"the age must be bigger than 0"); } this.age = age; } public Int32 Get_Age() { return age; } }
这样之后我们是不能直接给name和age赋值的,我们如果要访问name和age必须要使用get和set来封装字段。这样给我们带来的好处是
1 可以使用线程安全来访问字段。 2 如果字段是一个逻辑字段。她的值不值内存中的字节,是要计算的得到的。
将字段声明为private就能够达到上面的要求
当我们使用get和set的方式来封装了字段之后又两个缺点
1. 不得不实现额外的方法来对字段封装。无形之中添加的很多的代码量
2. 用户在使用字段的使用必须调用方法。这样给人的感觉是不是很好的
Person p = new Person(); p.Set_Name("hanxingzhi"); string Name = p.Get_Name(); p.Set_Age(-5);//这里当我们调用这个方法时是不能对age字段赋值的,因为在方法的内部对传入的参数进行了判断。这是会抛出异常的
在CLR中使用了属性的方式来代替了get和set方式对字段的访问封装。同时这还可以避免上面的两个缺点
public sealed class Person { private string name; private Int32 age; public String Name{ get {return name;} set { name = value;}} public Int32 Age { get { return age;} set { if(value < 0) throw new ArgumentException("value",value.ToString(),"the age must be bigger than 0"); age = vlaue; } } }
其实上面给的代码在编译器编译的时候也是要编译成get和set形式的封装字段。
属性的控制
1. 实现只读或者只写字段
public String Name{ get { return name;}}//只读字段
当把字段写成这样的形式时。在编译器变成的代码中没有SetXXX方法。只有一个GetXXX方法。
public String Name{ set { name = value;}}//只写字段
同理与只读字段
2 如果在定义属性的时候使用的是别的访问修饰符 如 protected private 那么生成的get和set方法同样会成为 protected private...
3 单独的控制 public String Name{} 暂时先放着。
供自己学习使用
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。