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?

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top