字段
什么是字段
字段(field)是一种表示与对象或类型/结构体关联的变量
字段是类型的成员,旧称“成员变量”
与对象关联的字段也叫做实例字段
与类型关联的字段称为静态字段,由static修饰
字段的声明
参见C#语言定义文档
尽管字段声明带有分号,但它不是语句
字段的名字一定是名词
字段的初始值
无显示初始化时,字段获得其类型的默认值,所以字段永远都不会未被初始化
实例字段初始化的时机-对象创建时
静态字段初始化的时机-类型被加载的时候
只读字段
实例只读字段
静态只读字段
属性
什么是属性
属性是一种用于访问对象或类型的特征的成员,特征反映了状态
属性是字段的自然拓展
从命名上看,field更偏向于实例对象在内存中的布局,property更偏向于反映现实世界对象的特征
对外:暴露数据,数据可以是存储在字段里的,也可以是动态计算出来的
对内:保护字段不被非法值污染
属性又Get/Set方法对进化而来
又一个语法糖-属性背后的秘密
属性的声明
完整声明-后台成员变量与访问器
简略声明-只有访问器
动态计算值的属性
注意实例属性和静态属性
属性的名字一定是名词
只读属性-只有getter没有setter
尽管语法上正确,几乎没有人使用只写属性,因为属性的主要目的是通过向外暴露数据而表示对象/类型的代码
属性与字段的关系
一般情况下,它们都用于表示实体的状态
属性大多数情况下是字段的包装器
//代码效果参考: http://www.lyjsj.net.cn/wx/art_23036.html建议:永远使用属性来暴露数据,即字段永远都是private或protected的
字段到属性进化史
public class Student
{
public int Age;
}
此时实例化获得对象后,使用Age字段,可以设置任意值,容易被污染
public class Student
{
private int age;
public int GetAge()
{
return this.age;
}
public void SetAge(int value)
{
if (value>=0&&value<=100)
{
this.age = value;
}
else
{
throw new Exception("错误的输入");
}
}
}
}
将字段的访问性设为private(一般会小写开头),然后添加方法来管理获取和设置字段值。
上面的方法过于冗长,而且获取设置要通过方法,没有最开始直接调用字段来的直接。微软创造了属性这个概念,里面有set,get访问器。
public class Student
{
private int age;
public int Age
{
get
{
return this.age;
}
set
{
if (value>=0&&value<=100)
{
this.age = value;
}
//代码效果参考:http://www.lyjsj.net.cn/wx/art_23034.html
else{
throw new Exception("输入错误");
}
}
}
}
这样一来通过属性来暴露数据,在属性里做对字段的处理逻辑。
索引器
什么是索引器
索引器是这样一种成员:它使对象能够用与数组相同的方式进行索引
索引器的声明
参见C#语言定义文档
注意:没有静态索引器
常量
什么是常量
常量是表示常量值的类成员
常量隶属于类型而不是对象,即没有实例常量
注意区分成员常量与局部常量
常量的声明
各种只读的应用场景
为了提高程序的可读性和执行效率--常量
为了防止对象的值被改变--只//代码效果参考:http://www.lyjsj.net.cn/wz/art_23032.html
读字段向外暴露不允许修改的数据--只读属性,功能与常量有一些重叠
当希望成为常量的值类型不能被常量声明接受时--静态只读字段