Proprietà implementate automaticamente
Le proprietà implementate automaticamente rendono la dichiarazione di proprietà più concisa quando non sono necessarie altre logiche nelle funzioni di accesso alle proprietà. Consentono inoltre al codice client di creare oggetti. Quando si dichiara una proprietà come mostrato nel seguente esempio, il compilatore crea un campo sottostante privato anonimo accessibile solo tramite le funzioni di accesso get
e set
della proprietà. init
le funzioni di accesso possono anche essere dichiarate come proprietà implementate automaticamente.
L'esempio seguente mostra una classe semplice con alcune proprietà implementate 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;
}
}
Non è possibile dichiarare le proprietà implementate automaticamente nelle interfacce. Le proprietà supportate da campi e implementate automaticamente dichiarano un campo sottostante di un'istanza privata e le interfacce non possono dichiarare i campi dell'istanza. La dichiarazione di una proprietà in un'interfaccia senza definire un corpo dichiara una proprietà con funzioni di accesso. Ogni tipo che implementa tale interfaccia deve implementare tale proprietà.
È possibile inizializzare le proprietà implementate automaticamente in modo analogo ai campi:
public string FirstName { get; set; } = "Jane";
La classe mostrata nell'esempio precedente è modificabile. Il codice client può modificare i valori negli oggetti dopo la creazione. Nelle classi complesse che contengono un comportamento significativo (metodi) e i dati, spesso è necessario disporre di proprietà pubbliche. Tuttavia, per classi o struct di piccole dimensioni che incapsulano semplicemente un set di valori (dati) e presentano comportamenti minimi o nulli, è consigliabile usare una delle opzioni seguenti per rendere gli oggetti non modificabili:
- Dichiarare solo una funzione di accesso
get
(non modificabile ovunque tranne il costruttore). - Dichiarare una funzione di accesso
get
e una funzione di accessoinit
(non modificabile ovunque tranne durante la costruzione di oggetti). - Dichiarare la funzione di accesso
set
come privata (non modificabile ai consumer).
Per altre informazioni, vedere Come implementare una classe leggera con proprietà implementate automaticamente.
Potrebbe essere necessario aggiungere la convalida a una proprietà implementata automaticamente. C# 13 aggiunge le proprietà supportate dai campi come funzionalità di anteprima. Usare la field
parola chiave per accedere al campo sottostante sintetizzato dal compilatore di una proprietà implementata automaticamente. Ad esempio, è possibile assicurarsi che la FirstName
proprietà nell'esempio precedente non possa essere impostata su null
o sulla stringa vuota:
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";
Questa funzionalità consente di aggiungere logica alle funzioni di accesso senza che sia necessario dichiarare in modo esplicito il campo sottostante. Usare la field
parola chiave per accedere al campo sottostante generato dal compilatore.
Importante
La field
parola chiave è una funzionalità di anteprima in C# 13. È necessario usare .NET 9 e impostare l'elemento <LangVersion>
su preview
nel file di progetto per usare la field
parola chiave contestuale.
È consigliabile prestare attenzione usando la funzionalità parola field
chiave in una classe con un campo denominato field
. La nuova field
parola chiave ombreggiate un campo denominato field
nell'ambito di una funzione di accesso alle proprietà. È possibile modificare il nome della field
variabile oppure usare il @
token per fare riferimento all'identificatore field
come @field
. Per altre informazioni, leggere la specifica della funzionalità per la field
parola chiave .