1.属性声明
属性的声明方式与字段相似,区别是属性声明以在分隔符 {
和 }
之间写入的 get
访问器或 set
访问器结束,而不是以分号结束。
属性需与字段配套使用,字段是数据成员(定义存储位置),而属性是为了操作private
字段而生的函数成员(不定义存储位置)。
//常规语法
public class Person
{
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
private string firstName;
}
//Expression-bodied表达式声明法
public class Person
{
public string FirstName
{
get => firstName;
set => firstName = value;
}
private string firstName;
}
自动实现的属性
语法会自动生成支持此属性的字段的存储位置并自动实现 get
和 set
访问器,无需显式声明字段。
get
和 set
访问器(或 get
和 init
访问器)只要书写其中一个并且未实现代码即为自动实现的属性
。
//自动实现的属性语法
public class Person
{
public string FirstName { get; set; }
}
2.属性分类
名称 | 修饰符 |
静态属性 | 用 static 修饰 |
实例属性 | 无 static 修饰 |
3.访问器
属性通过访问器实现,访问器用于定义访问属性或为属性赋值时执行的语句,get
访问器读取该值,set
访问器写入该值,可以使用 init
访问器代替 set
访问器用于仅在对象构造过程中初始化分配新值。
get
访问器是没有参数且返回类型为属性类型的方法,而set
访问器是value
参数且返回值为void
的方法。
同时具有 get
访问器和 set
访问器的属性是 读写属性
,只有一个 get
访问器的属性是 只读属性
,只有一个 set
访问器的属性是 只写属性
。
4.只读属性
字段可以通过readonly
将字段声明为只读字段
,属性可以通过访问器来将属性声明为只读属性
。
编译器会将自动实现的属性
的 get
访问器隐式声明为 readonly
,而不管属性声明中是否存在 readonly
修饰符。
//常规语法
public class Person
{
public Person(string firstName) => this.FirstName = firstName;
public string FirstName { get; }
}
//Expression-bodied表达式声明法
public class Location
{
private string locationName;
public Location(string name)
{
locationName = name;
}
public string Name => locationName;
}
5.抽象属性
声明抽象属性时(如本示例中的 Area
),只需指明哪些属性访问器可用即可,不要实现它们。在此示例中,仅 get
访问器可用,因此该属性是只读属性。
public abstract double Area
{
get;
}
public override double Area
{
get
{
// Given the side, return the area of a square:
return side * side;
}
}
6.修饰符
属性其余还支持 new、override、sealed、virtual
修饰符。
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/8256.html