C#中的字段,属性,常量
字段(field)
一种表示与对象或类型(类或结构体)关联的变量,旧称成员变量
(attributes)(field-modifiers) type variable-declarators; //字符声明,括号表示可选
- 实例字段,与对象关联的
- 静态字段,与类型关联的,由static修饰的字段
字段修饰符field-modifier
-
public,protected,private
-
new(显式隐藏从基类继承的成员)
-
internal(同一个程序集中可访问)
-
static
-
readonly(只读)
一旦初始化就无法再赋值
-
volatile(易变的,常用于多线程)
关于internal: https://www.cnblogs.com/wowoblog/p/6970502.html
字段初始值
- 显式初始化(在声明时初始化或使用构造函数)
- 实例字段(其初始化在创建的时候)
- 静态字段(其初始化在加载时唯一构造一次,对应静态构造函数)
- 隐式初始化,字段获得该类型默认值
属性(property)
一种用于访问对象或类型的特征的成员,是字段的进化
C++中用private来封装类中的成员变量,用public定义取值方法和修改方式,以此来保护值不被污染(被赋予超出可能性赋值范围的值)
class Program
{
static void Main(string[]ages)
{
People man1=new People();
man1.SetAge(1000);
Console.WriteLine(man1.GetAge());
}
}
class People
{
private int age;
public int GetAge()
{
return age;
}
public int SetAge(int num)
{
age=num;
}
}
//Output:man1's age = 1000
//显然年龄不可能为1000,该年龄为错误值
相同作用但使用属性表示
private int age
{
get
{
return age;
}
set
{
if(value>0&&value<130)
{
this.age = value;
}
else //若数值错误,则抛出异常
{
throw new Exception("error age");
}
}
}
属性一般格式
private/protected type variable-declarators
modifiers type variable-declarators
{
get
{
......
}
set
{
...... //临时值value为传入值固定名字
}
}
在VS里面快捷生成先输入propfull再按两下Tab键即可快捷完整生成一个属性,每按一下Tab键跳转位置,自定义修改该属性,而使用prop然后按下两下Tab键则是快捷简单生成一个属性,此时该简单生成的属性类似于一个字段,如下
private int myVar; //propfull
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
public int MyProperty { get; set; } //prop
VS中还提供了选中变量声明,鼠标右键选中重构,可以帮你封装成属性或者仍用字段
而在set和get前添加访问修饰符,能限定外部无法修改或访问该字段;或者删除其中一个,还能限定该字段只读或只写,但一般只会设置只读而不会设置只写
总的来说,属性和字段核心作用是一样的,但属性一般算是字段的包装,推荐永远使用属性暴露数据(可以保护字段),将其字段用private或protected封装起来
常量(constant)
modifiers const <data_type> <constant_name> = value;
不同只读场景的不同区别
- 为提高程序执行效率--常量
- 为防止对象的值被修改--只读字段
- 为暴露不可修改的数据--只读属性
- 当希望成为常量的值其类型(类/结构体)不能被常量声明接受时--静态只读字段