c# - setter 和支持字段中的 .NET 逻辑

标签 c# .net setter

我有两个属性,当第一个属性(FXRate)发生变化时,必须更新后一个属性(CalulcatedValue)。

我可以通过将 CalulcatedValue 设为只读并从 FXRate setter 调用 OnPropertyChanged("CalculatedValue") 来实现。

public double FXRate {
    get { return _fXRate; }
    set {
        Set(_fXRate, value, "FXRate");
        OnPropertyChanged("CaluclatedValue");
    }
}

public float CalculatedValue  
{
    get { return FXRate * SomeOtherValue;}
}

但我知道 CalulcatedValue 属性会被多次调用(用于多个 LINQ 查询等)。我在考虑 getter 应该非常快速地返回值,并计划为其设置一个支持字段。

public double FXRate 
{
    get { return _fXRate;}
    set {
        Set(_fXRate, value, "FXRate");
        CalculatedValue = 0; //how to set CalculatedValue since it's setter is calculating it with its logic, i.e. the value parameter is not needed ?
    }
}
private double _fXRate;

public float CalculatedValue  
{
    get { return _calculatedValue; }
    set {
        __calculatedValue = FXRate * SomeOtherValue); //consider this line takes some effort to be calculated -> instead of SomeOtherValue there might be pretty complex logic here to get the result
        OnPropertyChanged("CalculatedValue");
    }
}
private float _calculatedValue;

CalulcatedValue 现在应该如何设置?它不需要传递任何值参数,因为逻辑在 setter 内部。线路

CalulcatedValue=0

现在愚蠢的事情发生了。

最佳答案

如果您需要 INotifyPropertyChanged 通知,请将其添加到您的 FXRate 属性(和/或任何可能更改 CalculatedValue 值的属性) ,并在那里进行计算:

private double _fXRate;
private float _calculatedValue;

public double FXRate 
{
  get { return _fXRate;}
  set {
      Set(_fXRate, value, "FXRate");
      _calculatedValue = _fxRate * SomeOtherValue;
      // this will update any control depending on the `CalculatedValue` notification
      OnPropertyChanged("CalculatedValue");
  }
}

public float CalculatedValue  
{
  get { _calculatedValue; }
}

或者,如果您想将计算推迟到第一次读取(因为您将在实际读取 CalculatedValue 之前多次更新您的 FxRate 或其他内容) ,你可以这样做:

private double _fXRate;
private float _calculatedValue;
private bool _calculatedValueIsDirty = true;

public double FXRate 
{
  get { return _fXRate;}
  set {
      Set(_fXRate, value, "FXRate");
      _calculatedValueIsDirty = true;
      OnPropertyChanged("CalculatedValue");
  }
}

public float CalculatedValue  
{
  get { 
      if(_calculatedValueIsDirty) {
        _calculatedValue = _fxRate * SomeOtherValue;
        _calculatedValueIsDirty = false;
      }
      return _calculatedValue;
  }
}

CalculatedValue 的后续读取将很快返回,除非预先计算的值再次变脏(通过更改 FXRate)

PS:如果有任何类似于多线程的东西,请在必要时应用锁:-)

关于c# - setter 和支持字段中的 .NET 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32327741/

相关文章:

c# - 这两个 linq 实现有什么区别?

java - Setter 和 getter 不工作

arrays - 在属性写入中引用一个公共(public) setter

c# - 如何遍历匿名类型的列表

python - 适用于 Python/PHP/C# Coder 的 iOS 最佳介绍

.net - 具有单文件可执行文件的 .NET 5.0 Linux 中的原始程序集位置

java - 如何使用反射定义动态的setter和getter?

c# - 如何在知道方向、角度和距离的情况下找到位置?

c# - 使用事件在 NHibernate 中进行数据审计

c# - 如何在 xaml 中的硬编码值上使用转换器