문제

   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.
   }

이 클래스를 사용하는 내 코드는 계속 수정됩니다 Data 그래서 관련 변경 사항을보고 싶습니다 Total 또한.

재 계산하는 기능을 추가하고 싶지 않습니다 Total 수정하는 코드에 Data.

예시:

   Foo f = new Foo(); // Total = 0 
   f.Data.Add(10);    // Total = 10
   f.Data.Add(30);    // Total = 40
   f[1] = 40;         // Total = 50
   // etc

그렇다면이 문제에 대한 해결책은 무엇입니까?

도움이 되었습니까?

해결책

Alter total 대신 총을 동적으로 반환 할 수있는 기능을 얻습니다 (LINQ 사용이 가장 쉽습니다).

private float Total
{
   get
   {
      return Data.Sum();
   }
}

세트 액세서가 실제로 필요하지 않습니다.

다른 팁

여기서는 문제가 보이지 않습니다. 그만큼 Total 얻는 사람 목록이 호출 될 때 목록의 총계를 동적으로 계산할 수 있으며, 이는 목록을 전혀 수정하지 않습니다. 그러나 나는 당신이 어떻게 구현하고 싶은지 알 수 없습니다. 세터 총 ...

  private float Total { // Contains sum of numbers in Data
    get {
      float total = 0;
      foreach (float value in Data) {
        total += value;
      }
      return total;
    }
  }

당신은 데이터를 노출시키고 있습니다. 언제든지 지워질 수 있습니다. 다음을 제안합니다.

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; }
}

전체 getter에 계산 로직 추가 :

private float Total
{
  get { return CalculateResult(Data) };
}

이렇게하면 세터가 필요하지 않습니다. 물론 캐시 할 수 있습니다 : 데이터 목록을 변경할 때 변경된 클래스에 더티 플래그를 소개합니다. 그런 다음 캐시 계산 결과 로컬 클래스 필드로 전체 Getter에 들어가서 더러운 플래그가 설정되지 않은 경우 재사용하십시오 (재 계산시).

총 속성에 세터가 필요하지 않다고 생각하지만 Getter는 단순히 모든 전화에 대해 합계를 다시 계산합니다.

class Foo
   {
       public List<float> Data { get ; set ; }  // list of numbers
       private float Total { get{return Data.Sum()} ; } // Contains sum of numbers in Data


   }

세터가 필요한 이유는 무엇입니까? Total? 가장 좋은 방법은 총 자동 계산 속성을 만들고 총계의 getter 값을 동적으로 계산하는 것입니다.

또는 ... 개인 필드를 소개 할 수 있습니다 data 그리고 total 그리고 다시 계산하십시오 total 이내에 Data 세터.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top