概念
类中的一个数据项的成员。写入和读取与字段相同
例
MyClass mc = new MyClass();
mc.MyField = 5;
mc.MyProperty = 10;
特征
- 它是命名的类成员。
- 它有类型。
- 它可以被赋值和读取。
和字段不同
- 它不为数据存储分配内存!
- 它执行代码。
访问器
是指定的一组两个匹配、称为访问器的方法
- set访问器为属性赋值。
- get访问器从属性获取值。
例
int MyValue
{
set
{
//void类型
}
get
{
//返回属性类型的值
}
}
属性声明和访问器
可以把set访问器想象成一个方法,带有单一的参数"设置"属性的值
get访问器没有参数并从属性返回一个值
set访问器
- 拥有一个单独的、隐式的值参,名称为value,与属性的类型相同;
- 拥有一个返回类型void。
get访问器
- 没有参数;
- 拥有一个与属性类型相同的返回类型。
实例
class C1
{
private int theTralVaule;
public int MyValue
{
set {
theTralVaule = vaule;
}
get {
return theTralVaule;
}
}
}
使用
MyValue = 5; //隐式调用set
z = MyValue; //隐式调用get
只能隐式调用get/set,不能显示调用
属性和只读属性
要想不定义属性的某个访问器,可以忽略该访问器的声明。
- 只有get访问器的属性称为只读属性。只读属性是一种安全的,把一项数据从类或类的实例中传出,而不允许太多访问方法。
- 只有set访问器的属性称为只写属性。只写属性是一种安全的,把一项数据从类的外部传入类,而不允许太多访问的方法。
- 两个访问器中至少有一个必须定义,否则编译器会产生一条错误信息。
属性和公共字段
- 属性是函数型成员而不是数据成员,允许你处理输入和输出,而公共字段不行。
- 属性可以只读或只写,而字段不行。
- 编译后的变量和编译后的属性语义不同。
自动实现属性
运行只声明属性而不声明后备字段(和属性关联的字段,如上面的theTralVaule字段),编译器会自动为你创建隐藏的后备字段,并且自动挂到get和set访问器上
规则
- 不声明后备字段——编译器根据属性的类型分配存储。
- 不能提供访问器的方法体——它们必须被简单地声明为分号。get担当简单的内存读,set担当简单的写。
- 除非通过访问器,否则不能访问后备字段。因为不能用其他的方法访问它,所以实现只读和只写属性没有意义,因此必须同时提供读写访问器。
示例
class C1
{
public int MyValue
{
set;get;
}
}
static void Main() {
C1 c = new C1();
c.MyValue = 10; //赋值属性
Console.WriteLine($"{c.MyValue}"); //读属性
}
静态属性
静态属性的访问器和所有静态成员一样,可以使用static
规则
- 不能访问类的实例成员——虽然它们能被实例成员访问。
- 不管类是否有实例,它们都是存在的。
- 当从类的外部访问时,必需使用类名引用,而不是实例名。
例
class Trivial
{
public static int MyValue { get; set; }
public void PrintVaule()
{
Console.WriteLine($"Vaule:{MyValue}");
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"Vaule:{Trivial.MyValue}");
Trivial.MyValue = 10;
Console.WriteLine($"Vaule:{Trivial.MyValue}");
Trivial tr = new Trivial();
tr.PrintVaule();
Console.ReadKey();
}
}
结果
Vaule:0
Vaule:10
Vaule:10