Questa è una nuova funzionalità di C # 6, "Getter-only auto-properties", nota anche come "Auto-Property Initializers for Read-Only Properties" come discusso in questo articolo della rivista MSDN "C #: The New and Improved C # 6.0" di Mark Michaelis e nella bozza di specifica del linguaggio C # 6.0 .
Il setter del campo di sola lettura è accessibile solo nel costruttore, in tutti gli altri scenari il campo è ancora di sola lettura e si comporta come prima.
Questa è una sintassi comoda per ridurre la quantità di codice che è necessario digitare e per rimuovere la necessità di dichiarare esplicitamente una variabile a livello di modulo privato per contenere il valore.
Questa funzionalità è stata considerata importante poiché, dall'introduzione delle proprietà implementate automaticamente in C # 3, le proprietà modificabili (quelle con getter e setter) erano diventate più veloci da scrivere rispetto a quelle immutabili (quelle con solo un getter), il che significa che le persone erano essere tentati di utilizzare proprietà modificabili per evitare di dover digitare il codice per un campo di supporto solitamente richiesto per le proprietà di sola lettura. Sono disponibili ulteriori discussioni sulle proprietà implementate automaticamente nella sezione pertinente della Guida per programmatori Microsoft C # .
Questo post del blog, "# 1,207 - C # 6.0 - Inizializzatori di proprietà automatica per proprietà di sola lettura" di Sean Sexton ha una buona spiegazione ed esempio come segue:
Prima di C # 6.0, se si voleva una proprietà di sola lettura (immutabile), si usava in genere un campo di supporto di sola lettura inizializzato nel costruttore, come mostrato di seguito.
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
private readonly DateTime creTime;
public DateTime DogCreationTime
{
get { return creTime; }
}
public Dog(string name)
{
Name = name;
creTime = DateTime.Now;
}
}
In C # 6.0 è possibile usare proprietà implementate automaticamente per implementare una proprietà di sola lettura. A tale scopo, utilizzare un inizializzatore di proprietà automatica. Il risultato è molto più chiaro rispetto all'esempio precedente, in cui dovevamo dichiarare esplicitamente un campo di supporto.
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
public DateTime DogCreationTime { get; } = DateTime.Now;
public Dog(string name)
{
Name = name;
}
}
Maggiori dettagli possono essere trovati anche nel repository dotnet Roslyn su GitHub :
Le proprietà automatiche possono ora essere dichiarate senza un setter.
Il campo di supporto di una proprietà automatica solo getter è implicitamente dichiarato di sola lettura (sebbene ciò sia importante solo per scopi di riflessione). Può essere inizializzato tramite un inizializzatore sulla proprietà come nell'esempio sopra. Inoltre, è possibile assegnare una proprietà solo getter nel corpo del costruttore del tipo dichiarante, che fa sì che il valore venga assegnato direttamente al campo sottostante:
Si tratta di esprimere i tipi in modo più conciso, ma nota che rimuove anche un'importante differenza nel linguaggio tra tipi mutabili e immutabili: le proprietà automatiche erano una scorciatoia disponibile solo se eri disposto a rendere la tua classe mutabile, e quindi la tentazione di default a quello è stato fantastico. Ora, con le proprietà automatiche solo getter, il campo di gioco è stato livellato tra mutevole e immutabile.
e nella bozza di specifica del linguaggio C # 6.0 (NB: la specifica del linguaggio è definitiva per quanto riguarda Microsoft, ma deve ancora essere approvata come standard EMCA / ISO , da cui la 'bozza'):
Proprietà implementate automaticamente
Una proprietà implementata automaticamente (o auto-proprietà in breve), è una proprietà non astratta non esterna con corpi di accesso solo punto e virgola. Le proprietà automatiche devono avere una funzione di accesso get e facoltativamente possono avere una funzione di accesso set.
Quando una proprietà viene specificata come una proprietà implementata automaticamente, un campo di supporto nascosto è automaticamente disponibile per la proprietà e le funzioni di accesso vengono implementate per leggere e scrivere in quel campo di supporto. Se la proprietà auto non ha una funzione di accesso impostata, il campo di supporto viene considerato di sola lettura (campi di sola lettura). Proprio come un campo di sola lettura, una proprietà automatica solo getter può anche essere assegnata nel corpo di un costruttore della classe che lo racchiude. Tale assegnazione viene assegnata direttamente al campo di supporto di sola lettura della proprietà.
Una proprietà automatica può opzionalmente avere un property_initializer, che viene applicato direttamente al campo sottostante come variable_initializer (inizializzatori di variabili).