属性
属性(property)是一个方法或一对方法,在客户端代码看来,它(们)是一个字段。
例如:
public class User { // 将用户的名称字段设置为_开头且小写形式命名的私有字段。 private string _name; // Name属性包含get和set访问器,来检查和设置支持字段的值 public string Name { // get访问器不带任何参数,且必须返回属性声明的类型。 get { return _name; } // 也不该为set访问器指定任何显示参数 set { // 但编译器嘉定它带一个参数,类型与属性相同,并表示为value _name = value; } } }
具有表达式体的属性访问器。
在较新的C#版本中,还可以将属性访问器编写为具有表达式体的成员。
例如以下新的语法糖,减少了编写大括号的需求,并且使用get访问器省略了return关键字:
1 public class User 2 { 3 private string _name; 4 5 public string Name 6 { 7 get => _name; 8 set => _name = value; 9 } 10 }
自动实现的属性
如果属性的get和set访问器中没有任何逻辑,就可以使用自动属性。
这种属性会自动实现后备成员的变量,例如:
1 public class User 2 { 3 public string Name { get; set; } 4 }
自动属性可以使用属性初始化器来初始化属性值:
public class User { /// <summary> /// 默认姓名为小明 /// </summary> public string Name { get; set; } = "小明"; }
属性的访问修饰符
C#允许给属性的get和set访问器设置不同的访问修饰符,所以属性可以有公共的get访问器和私有或受保护的set访问器。
例如以下代码:
public class User { private string _name; public string Name { // get访问器没有任何访问修饰符,这表示get访问器具有属性的访问级别。 get => _name; // set拥有一个私有访问修饰符 private set => _name = value; // get和set访问器必须有一个具有属性的访问级别,不然编译器会报错。 } }
只读属性
在属性定义中省略set访问器,就可以创建只读属性。
例如:
public class User { private readonly string _name; public string Name { get => _name; } }
使用readonly修饰符定义的字段,只允许在构造函数中初始化属性的值:
public class User { private readonly string _name; public string Name => _name; public User(string name) { _name = name; } }
自动实现的只读属性
C#提供了一个简单的语法,使用自动实现的属性创建只读属性,访问只读字段。这些属性可以使用属性初始化器来初始化。
public class User { public string Id { get; } = Guid.NewGuid().ToString("N"); }
只读属性也可以显示地在构造函数中初始化,例如:
public class User { public string Id { get; } public User(string id) => Id = id; }
表达式体属性
从C#6开始,只有get访问器的属性可以使用表达式体属性实现。
类似于表达式体方法,表达式体属性不需要花括号和返回语句。
表达式体属性带有get访问器的属性,但不限于要编写get关键字。
例如:
1 public class User 2 { 3 public User(string firstName, string lastName) 4 { 5 FirstName = firstName; 6 LastName = lastName; 7 } 8 public string FirstName { get; } 9 public string LastName { get; } 10 public string FullName => $"{FirstName} {LastName}"; 11 }