13. 属性详解
属性是字段和方法的交集,看起来像字段,用起来像方法。访问属性所用的语法和访问字段一样
光看这一段其实毫无感觉,而且其实我看了很多实际项目代码里面也比较难找到有使用属性的,可能在大型工程里面会经常使用这个特性,属性也是封装的手段,我们还是认真学习一下。
封装原则意味着数据都要保持私有private
状态,如果不是私有,则在class以外也可以随意读取数据,造成数据出错。
我们来看看使用属性后会有什么帮助。
假设有两个变量_x,_y(一般使用属性时,变量名前面最好加个_)
public class cls
{
private int _x, _y;
public int X //属性名X
{
get{return this._x;} //注意;号在中括号里面
set{this._x = value;}
}
public int Y //属性名Y
{
get{return this._y;} //get为取值访问器
set{this._y = value;} //set为赋值访问器
}
}
好了,那如何用属性来赋值或取值呢?
cls class1 = new cls();
int x1 = class1.X; //实际调用了class1.X.get
int y1 = class1.Y;
class1.X = 40; //实际调用了class1.Y.set
class1.Y = 100;
也可以只写set或只写get,这样属性只读或者只写
- 如果属性只读(即只写了get),如果给它赋值则会编译错误
- 如果属性只写(即只写了set),如果取值则会编译错误
只写属性可以用于密码应用
在实际使用时,可以直接写空的属性,节省时间
class Circle
{
public int Radius{get;set;} //注意有两个分号
...
}
其他什么都不用做,但是编译器会自动帮你生成一个私有字段_radius,要使用的时候直接用Circle.Radius即可。
使用属性初始化对象
在创建类的实例时,可以为具有set访问器的任何公共属性指定名称和值
举个例子来帮助理解:一个类里定义了3个属性,可以用一个默认构造器初始化3个属性的值,之后在初始化对象时,直接改写3个属性的值,即可完成初始化。
class Polygon
{
public int NumSides { get; set; }
public double SideLength { get; set; }
public Polygon()
{
this.NumSides = 4;
this.SideLength = 10.0;
}
}
Polygon square = new Polygon(); //使用默认构造器,则两个值不修改
Polygon triangle = new Polygon { NumSides = 3 }; //将NumSides重载为3,SideLength不修改
Polygon pentagon = new Polygon { SideLength = 15.5, NumSides = 5 }; //两个值均修改
这样看来,属性还是蛮方便的。