自动实现的属性(C# 编程指南)
当属性访问器中不需要任何其他逻辑时,自动实现的属性会使属性声明更加简洁。 它们还允许客户端代码创建对象。 当你声明以下示例中所示的属性时,编译器将创建仅可以通过该属性的 get
和 set
访问器访问的专用、匿名支持字段。 在 C# 9 及更高版本中, init
访问器也可以声明为自动实现的属性。
示例
下列示例演示一个简单的类,它具有某些自动实现的属性:
// This class is mutable. Its data can be modified from
// outside the class.
public class Customer
{
// Auto-implemented properties for trivial get and set
public double TotalPurchases { get; set; }
public string Name { get; set; }
public int CustomerId { get; set; }
// Constructor
public Customer(double purchases, string name, int id)
{
TotalPurchases = purchases;
Name = name;
CustomerId = id;
}
// Methods
public string GetContactInfo() { return "ContactInfo"; }
public string GetTransactionHistory() { return "History"; }
// .. Additional methods, events, etc.
}
class Program
{
static void Main()
{
// Initialize a new object.
Customer cust1 = new Customer(4987.63, "Northwind", 90108);
// Modify a property.
cust1.TotalPurchases += 499.99;
}
}
不能在接口中声明自动实现的属性。 自动实现的属性声明一个私有实例支持字段,并且接口可能不声明实例字段。 如果在接口中声明属性而不定义主体,请使用访问器声明属性,访问器必须由实现该接口的每个类型实现。
你可以像字段一样初始化自动实现属性:
public string FirstName { get; set; } = "Jane";
上一示例中所示的类是可变的。 客户端代码在创建后可以更改对象中的值。 在包含重要行为(方法)以及数据的复杂类中,通常有必要具有公共属性。 但是,对于那些仅封装一组值(数据)且很少或没有行为的小型类或结构,应该使用以下选项之一使对象不可变:
- 只声明
get
访问器(除了能在构造函数中可变,在其他任何位置都不可变)。 - 声明
get
访问器和init
访问器(除了能在对象构造函数中可变,在其他任何位置都不可变)。 - 将
set
访问器声明为专用(对使用者不可变)。
有关详细信息,请参阅如何使用自动实现的属性实现轻量类。