C # question sur getter et setter?
-
06-07-2019 - |
Question
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.
}
Mon code qui utilise cette classe modifie sans cesse les Données
. Par conséquent, je souhaite également voir les modifications correspondantes apportées dans Total
.
Je ne souhaite pas ajouter de fonction qui recalcule Total
au code qui modifie Données
.
Exemple:
Foo f = new Foo(); // Total = 0
f.Data.Add(10); // Total = 10
f.Data.Add(30); // Total = 40
f[1] = 40; // Total = 50
// etc
Alors, quelle est la solution à ce problème?
La solution
Modifiez la fonction pour renvoyer le total de manière dynamique à la place (linq est le plus simple):
private float Total
{
get
{
return Data.Sum();
}
}
Pas vraiment besoin d'un accesseur d'ensemble.
Autres conseils
Je ne vois pas le problème ici. Total
getter peut calculer le total de la liste de manière dynamique lors de son appel, ce qui ne modifie pas du tout la liste. Cependant, je ne vois pas comment vous voulez implémenter un setter pour le total ...
private float Total { // Contains sum of numbers in Data
get {
float total = 0;
foreach (float value in Data) {
total += value;
}
return total;
}
}
Vous exposez les données, elles pourraient toutes être effacées à tout moment, je suggérerais ce qui suit:
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; }
}
Ajouter une logique de calcul au getter total:
private float Total
{
get { return CalculateResult(Data) };
}
De cette façon, vous n’avez même pas besoin de setter. Bien sûr, vous pouvez mettre en cache: introduire un indicateur modifié dans une classe modifiée lorsque vous modifiez la liste de données. Ensuite, le résultat du calcul en cache que vous obtenez dans Total getter dans un champ de classe local et que vous réutilisez si l’indicateur modifié n’est pas défini (désactivez-le lors du nouveau calcul).
Je pense que le setter n'est pas nécessaire dans la propriété total, mais le getter recalcule simplement la somme pour chaque appel
class Foo
{
public List<float> Data { get ; set ; } // list of numbers
private float Total { get{return Data.Sum()} ; } // Contains sum of numbers in Data
}
Pourquoi avez-vous besoin du programme de configuration sur Total
? Le meilleur moyen est de créer la propriété Total automatiquement et de calculer la valeur d'accesseur du Total de manière dynamique.
Ou ... vous pouvez introduire des champs privés données
et total
et recalculer total
au sein de Données
.