C # domanda su getter e setter?
-
06-07-2019 - |
Domanda
class Foo
{
public List<float> Data { get ; set ; } // list of numbers
private float Total { get ; set ; } // Contains sum of numbers in Data
// Constructors and other stuff.
}
Il mio codice che utilizza questa classe continua a modificare Data
, quindi voglio vedere anche le modifiche rilevanti in Total
.
Non voglio aggiungere una funzione che ricalcola Total
al codice che modifica Data
.
Esempio:
Foo f = new Foo(); // Total = 0
f.Data.Add(10); // Total = 10
f.Data.Add(30); // Total = 40
f[1] = 40; // Total = 50
// etc
Quindi qual è la soluzione a questo problema?
Soluzione
Modifica invece la funzione per restituire dinamicamente il totale (usare linq è più semplice):
private float Total
{
get
{
return Data.Sum();
}
}
In realtà non è necessario un set di strumenti di accesso.
Altri suggerimenti
Non vedo il problema qui. Il Total
getter può calcolare dinamicamente il totale dell'elenco quando viene chiamato, il che non modifica affatto l'elenco. Tuttavia, non vedo come desideri implementare un setter per il totale ...
private float Total { // Contains sum of numbers in Data
get {
float total = 0;
foreach (float value in Data) {
total += value;
}
return total;
}
}
Stai esponendo i Dati, potrebbero essere cancellati in qualsiasi momento, ti suggerirei quanto segue:
class Foo
{
private List<float> _data = new List<float>();
public float Total {get; private set;}
public void Add(float f) { _data.Add(f); Total += f; }
}
Aggiungi logica di calcolo al getter totale:
private float Total
{
get { return CalculateResult(Data) };
}
In questo modo non hai nemmeno bisogno di setter. Naturalmente è possibile memorizzare nella cache: introdurre il flag sporco in una classe che viene modificata quando si cambia l'elenco dei dati. Quindi, ottieni il risultato del calcolo della cache che ottieni in Total getter in un campo di classe locale e riutilizzalo se il flag sporco non è impostato (cancellalo al ricalcolo).
Penso che non sia necessario il setter nella proprietà totale, tuttavia il getter ricalcola semplicemente la somma per ogni chiamata
class Foo
{
public List<float> Data { get ; set ; } // list of numbers
private float Total { get{return Data.Sum()} ; } // Contains sum of numbers in Data
}
Perché hai bisogno di settare su Total
? Il modo migliore è rendere la proprietà calcolata automaticamente di Total e calcolare dinamicamente il valore getter del Total.
Oppure ... puoi introdurre campi privati ?? data
e total
e ricalcolare total
nel setter Data
.