C#中的属性
1)属性的定义方式与字段类似,但包含的内容较多,它可以在修改状态之前额外的执行一些操作。属性可以说有两个函数块儿,一个是获取属性的值(也就是get),一个设置属性的值(也就是set)。而字段一般首字母为小写,属性为大写;
class person //名为person的类
{
private int age; //名为age,int型私有字段
public int Age //名为Age,public型共有属性,目的为
{ //设置获取字段age,可根据需要设置不同访问级别
set
{
age = value; //设置属性值,注意这里一定为value,
} //不需要问原因,牢记即可
get
{
return age; //采用return返回age
}
}
}
2)这两个块儿也叫访问器,分别用set(设定)和get(获取)这两个关键字来定义;
3)可以在访问器上设置访问级别,例如可以设置为公有(public),私有(private)保护(protect),但是这里的访问级别针对的是此类以外的其他进行访问,例如若将基类中的访问器设置为private,那么派生类则不能使用基类中的访问器,当当然自身当然可以访问自身的访问器;
4)访问器可以根据需要设置为只读属性,只写属性,或者既读又写属性。所谓只读属性,是指只创建get而忽略set块儿,只写属性是指只创建set块儿,而忽略get块儿。既读又写属性是指既创建set块儿,又创建get块儿。
public int MyIntProp //只写属性,只有set
{
set
{
//property get code
}
}
public int MyIntProp //只读属性,只有get
{
get
{
//property get code
}
}
下面看一个类和属性的简单代码
static void Main(string[] args)
{
person p1 = new person(); //类的实例化
p1.Age = 30; //对访问器设置值,注意这里是Age而不是age
Console.WriteLine("{0}", p1.Age);
Console.ReadKey();
}
class person
{
private int age;
public int Age
{
set
{
this.age = value; //注意这里是age而不是Age
}
get
{
return this.age; //假如set和get中age都换为Age会是什么情形
}
}
}
将age换为Age
static void Main(string[] args)
{
person p1 = new person();
p1.Age = 30;
Console.WriteLine("{0}", p1.Age);
Console.ReadKey();
}
class person
{
private int age;
public int Age
{
set
{
this.Age = value; //此时已经将age换为Age
}
get
{
return this.Age;
}
}
}
想想会出现什么情况?
会出现无限循环,错误原因是“System.StackOverflowException”,就是一直在循环,计算机给憋死了,不干了。因为
this.Age = value;
会不断的调用此属性,属性名字是Age,然后又给Age赋值,相当于自己给自己赋值,每次都是自己调自己,然后自己给自己赋值,没完没了,纠结死了。有兴趣的可以自己试试