Una proprietà in C# è un membro di una classe che fornisce l'accesso ai dati contenuti in quella classe. Chi la usa può impostare o recuperare (get) i dati. Le proprietà possono essere auto-implementate oppure avere un campo di supporto. Sono composte da una funzione di accesso set e/o da una funzione di accesso get. In alcuni altri linguaggi un «mutator» è più o meno equivalente a una funzione di accesso set e un «accessor» è più o meno equivalente a una funzione di accesso get, anche se la composizione della sintassi è completamente diversa.
Quando si imposta una proprietà, il valore di input può essere convalidato, formattato o altrimenti manipolato; di fatto è possibile eseguire qualsiasi operazione programmatica accessibile al codice della classe.
Allo stesso modo, quando si recupera una proprietà, i dati possono essere calcolati o formattati e, ancora una volta, è possibile eseguire qualsiasi operazione programmatica a disposizione della classe.
Le proprietà hanno modificatori di accesso (public, private ecc.) allo stesso modo degli altri membri di una classe, ma la funzione di accesso set può avere un livello di accesso indipendente da quello della funzione di accesso di recupero (get), e viceversa. Una proprietà non deve per forza avere entrambe le funzioni di accesso: può averne una sola (get oppure set).
La sintassi di base per esprimere le proprietà può assumere due forme:
private int myField;
public int MyProperty
{
get { return myField; }
set { myField = value; }
}
public int MyProperty { get; private set; } = 42;
L'inizializzazione è facoltativa.
In questo esercizio modellerai una bilancia che usa i chilogrammi come unità.
Ci sono 6 compiti, ognuno dei quali richiede di implementare una o più proprietà:
Per venire incontro a esigenze diverse, consentiamo di personalizzare ogni bilancia con una precisione (il numero di cifre dopo il separatore decimale).
Implementa la classe WeighingMachine in modo che abbia una proprietà Precision di sola lettura, impostata sull'argomento precision del costruttore:
var wm = new WeighingMachine(precision: 3);
// => wm.Precision == 3
Implementa la proprietà WeighingMachine.Weight in modo da poter leggere e impostare il peso:
var wm = new WeighingMachine(precision: 3);
wm.Weight = 60.5;
// => wm.Weight == 60.5
È chiaro che nessuno può avere un peso negativo.
Aggiungi una validazione alla proprietà WeighingMachine.Weight in modo che lanci un'eccezione ArgumentOutOfRangeException quando si prova a impostarla su un peso negativo:
var wm = new WeighingMachine(precision: 3);
wm.Weight = -10; // Throws an ArgumentOutOfRangeException
La regolazione della tara può essere un valore qualsiasi (anche negativo, o un valore che rende negativo il peso visualizzato).
Implementa la proprietà WeighingMachine.TareAdjustment in modo da poter impostare la regolazione della tara:
var wm = new WeighingMachine(precision: 3);
wm.TareAdjustment = -10.6;
// => wm.TareAdjustment == -10.6
Dopo alcuni test approfonditi, sembra che, a causa di un problema di fabbricazione, tutte le bilance tendano a sovrastimare il peso di 5.
Modifica la proprietà WeighingMachine.TareAdjustment in modo che il suo valore predefinito sia 5.
var wm = new WeighingMachine(precision: 3);
// => wm.TareAdjustment == 5.0
Implementa la proprietà WeighingMachine.DisplayWeight, che deve restituire una stringa con il peso dopo la regolazione della tara, con la precisione corretta applicata e l'unità aggiunta.
Nota che:
display-weight = input-weight - tare-adjustment
var wm = new WeighingMachine(precision: 3);
wm.Weight = 60.567;
wm.TareAdjustment = 10;
// => wm.DisplayWeight == "50.567 kg"
Iscriviti a Exercism per imparare e padroneggiare C# con 62 concetti178 esercizi e il mentoring di persone reali, tutto gratis.