C # pergunta sobre getter e setter?
-
06-07-2019 - |
Pergunta
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.
}
Meu código que utiliza essa classe mantém modificar Data
então eu quero ver as alterações relevantes no Total
também.
Eu não quero adicionar a função que Recalcula Total
ao código que modifica 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
Então, qual é a solução para este problema?
Solução
Alter você começa função retornar dinamicamente o total de vez (usando LINQ é mais fácil):
private float Total
{
get
{
return Data.Sum();
}
}
Não há necessidade de um acessor set realmente.
Outras dicas
Não vejo o problema aqui. O Total
getter pode calcular o total da lista dinamicamente quando ele está sendo chamado, que não modificar a lista em tudo. No entanto, eu não vejo como você deseja implementar um setter para o total ...
private float Total { // Contains sum of numbers in Data
get {
float total = 0;
foreach (float value in Data) {
total += value;
}
return total;
}
}
Você está expondo os dados, tudo poderia ser apagados a qualquer momento, eu sugiro o seguinte:
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; }
}
Adicionar lógica de cálculo para o getter Total:
private float Total
{
get { return CalculateResult(Data) };
}
Desta forma, você não precisa mesmo setter. Claro que você pode armazenar em cache: introduzir a bandeira suja em uma classe que é alterado quando altera lista de dados. Em seguida, o resultado do cálculo de cache que você entrar em getter total a um campo de classe local e reutilização que, se a bandeira suja não está definido (limpá-la no recálculo).
Eu acho que não há necessidade para o setter na propriedade totais, no entanto o getter simplesmente recalcular a soma de todas as chamadas
class Foo
{
public List<float> Data { get ; set ; } // list of numbers
private float Total { get{return Data.Sum()} ; } // Contains sum of numbers in Data
}
Por que você precisa setter em Total
? A melhor maneira é fazer com propriedade total calculado automaticamente e calcular o valor getter do total dinamicamente.
Ou ... você pode introduzir campos data
privado e total
e total
recalcular dentro setter Data
.