C # Frage zu Getter und Setter?
-
06-07-2019 - |
Frage
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.
}
Mein Code, der diese Klasse verwendet, hält modifizieren Data
so dass ich auch die entsprechenden Änderungen in Total
sehen will.
Ich will nicht Funktion hinzuzufügen, die Total
auf den Code neu berechnet, die Data
modifiziert.
Beispiel:
Foo f = new Foo(); // Total = 0
f.Data.Add(10); // Total = 10
f.Data.Add(30); // Total = 40
f[1] = 40; // Total = 50
// etc
Was ist also die Lösung für dieses Problem?
Lösung
Ändern Sie Funktion erhalten, um dynamisch die Total Return statt (mit Linq ist am einfachsten):
private float Total
{
get
{
return Data.Sum();
}
}
Keine Notwendigkeit für einen Satz Accessor wirklich.
Andere Tipps
Ich sehe das Problem nicht hier. Die Total
Getter die Summe der Liste berechnen kann dynamisch, wenn es aufgerufen wird, die die Liste überhaupt nicht ändern. Aber ich sehe nicht, wie Sie eine Setter implementieren möchten für den gesamten ...
private float Total { // Contains sum of numbers in Data
get {
float total = 0;
foreach (float value in Data) {
total += value;
}
return total;
}
}
Sie haben die Daten auszusetzen, alles jederzeit gelöscht werden könnte, würde ich vorschlagen, die folgende:
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; }
}
In Berechnungslogik auf die Gesamt Getter:
private float Total
{
get { return CalculateResult(Data) };
}
Auf diese Weise können nicht einmal Setter brauchen. Natürlich können Sie Cache: Dirty-Flag in einer Klasse einführen, die geändert wird, wenn Sie Datenliste ändern. Dann Cache Berechnungsergebnis, das Sie in Total Getter zu einem lokalen Klassenfeld erhalten und wiederverwenden, wenn Dirty-Flag nicht gesetzt ist (klar auf Neuberechnung).
Ich denke, es gibt keine Notwendigkeit für die Setter in der gesamten Eigenschaft ist jedoch der Getter einfach neu berechnet die Summe für jeden Anruf
class Foo
{
public List<float> Data { get ; set ; } // list of numbers
private float Total { get{return Data.Sum()} ; } // Contains sum of numbers in Data
}
Warum brauchen Sie auf Total
Setter? Der beste Weg ist, um Gesamt Auto-berechnete Eigenschaft zu machen und die Getter Wert dynamisch Total zu berechnen.
oder ... können Sie private Felder data
und total
und neu berechnen total
innerhalb Data
Setter einzuführen.