Поделиться через


Автоматически реализованные свойства

Автоматически реализованные свойства делают объявление свойств более кратким, если в методах доступа к свойствам не требуется другая логика. Они также позволяют клиентскому коду создавать объекты. При объявлении свойства, как показано в следующем примере, компилятор создает закрытое анонимное резервное поле, которое может быть доступно только через методы доступа get и set свойства. 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 с атрибутом private (неизменяемое значение для потребителей).

Дополнительные сведения см. в статье "Реализация упрощенного класса с автоматически реализованными свойствами".

Возможно, потребуется добавить проверку в автоматически реализованное свойство. 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. Для использования контекстного ключевого field слова необходимо использовать .NET 9 и задать <LangVersion> элемент preview в файле проекта.

Следует тщательно использовать функцию field ключевого слова в классе с именем fieldполя. Новое field ключевое слово тенирует поле с именем field в области доступа к свойствам. Можно изменить имя переменной field или использовать @ маркер для ссылки на field идентификатор как @field. Дополнительные сведения см. в спецификации компонента для ключевого field слова.

См. также