gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:24:47 24 4
gpt4 key购买 nike

我有两个属性,当第一个属性(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com