自动实现的属性

当属性访问器中不需要其他逻辑时,自动实现的属性使属性声明更加简洁。 它们还允许客户端代码创建对象。 当你声明以下示例中所示的属性时,编译器将创建仅可以通过该属性的 getset 访问器访问的专用、匿名支持字段。 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 访问器声明为专用(对使用者不可变)。

有关详细信息,请参阅 如何实现具有自动实现属性的轻型类。

可能需要将验证添加到自动实现的属性。 C# 13 将字段支持的属性添加为预览功能。 使用 field 关键字访问自动实现属性的编译器合成后盾字段。 例如,可以确保 FirstName 前面的示例中的属性不能设置为 null 或空字符串:

public string FirstName 
{ 
    get; 
    set 
    { 
        field = (string.IsNullOrWhiteSpace(value) is false
            ? value
            : throw new ArgumentException(nameof(value), "First name can't be whitespace or null"));
    }
} = "Jane";

此功能使你可以向访问器添加逻辑,而无需显式声明后盾字段。 使用 field 关键字访问编译器生成的后盾字段。

重要

关键字 field 是 C# 13 中的预览功能。 必须使用 .NET 9 并将元素preview设置为<LangVersion>项目文件中,才能使用field上下文关键字。

应注意在 field 具有名为 field字段的类中使用关键字功能。 新 field 关键字将隐藏属性访问器范围中命名 field 的字段。 可以更改变量的名称 field ,或使用 @ 令牌将标识符引用 field@field。 可以通过阅读关键字的功能规范field来了解详细信息。

另请参阅