Propriedades implementadas automaticamente
As propriedades implementadas automaticamente tornam a declaração de propriedade mais concisa quando nenhuma outra lógica é necessária nos acessadores de propriedade. Elas também habilitam o código do cliente a criar objetos. Ao declarar uma propriedade, como mostrado no exemplo a seguir, o compilador cria um campo de suporte privado e anônimo que pode ser acessado somente por meio dos acessadores get
e set
da propriedade. init
Os acessadores também podem ser declarados como propriedades implementadas automaticamente.
O exemplo a seguir mostra uma classe simples que tem algumas propriedades implementadas automaticamente:
// 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;
}
}
Você não pode declarar propriedades implementadas automaticamente em interfaces. As propriedades implementadas automaticamente e com suporte de campo declaram um campo de suporte de instância privada e as interfaces não podem declarar campos de instância. Declarar uma propriedade em uma interface sem definir um corpo declara uma propriedade com acessadores. Cada tipo que implementa essa interface deve implementar essa propriedade.
Você pode inicializar propriedades implementadas automaticamente de forma semelhante aos campos:
public string FirstName { get; set; } = "Jane";
A classe mostrada no exemplo anterior é mutável. O código cliente pode alterar os valores nos objetos após a criação. Em classes complexas que contêm comportamento significativo (métodos) e dados, geralmente é necessário ter propriedades públicas. No entanto, para classes pequenas ou structs que encapsulam apenas um conjunto de valores (dados) e têm pouco ou nenhum comportamento, você deve usar uma das seguintes opções para tornar os objetos imutáveis:
- Declare apenas um acessador
get
(imutável em todos os lugares, exceto o construtor). - Declare um acessador
get
e um acessadorinit
(imutável em todos os lugares, exceto durante a construção do objeto). - Declare o acessador
set
como privado (imutável para os consumidores).
Para obter mais informações, consulte Como implementar uma classe leve com propriedades implementadas automaticamente.
Talvez seja necessário adicionar validação a uma propriedade implementada automaticamente. O C# 13 adiciona propriedades com suporte de campo como um recurso de visualização. Use a field
palavra-chave para acessar o campo de suporte sintetizado do compilador de uma propriedade implementada automaticamente. Por exemplo, você pode garantir que a FirstName
propriedade no exemplo anterior não possa ser definida como null
ou a cadeia de caracteres vazia:
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";
Esse recurso permite que você adicione lógica aos acessadores sem exigir que você declare explicitamente o campo de suporte. Use a field
palavra-chave para acessar o campo de suporte gerado pelo compilador.
Importante
A field
palavra-chave é um recurso de visualização no C# 13. Você deve estar usando o .NET 9 e definir seu <LangVersion>
elemento como preview
no arquivo de projeto para usar a field
palavra-chave contextual.
Você deve ter cuidado ao usar o recurso de field
palavra-chave em uma classe que tenha um campo chamado field
. A nova field
palavra-chave sombreia um campo nomeado field
no escopo de um acessador de propriedade. Você pode alterar o nome da field
variável ou usar o @
token para fazer referência ao field
identificador como @field
. Você pode saber mais lendo a especificação do recurso para a field
palavra-chave.