C# 两个属性相互更新
在一个类中,我有两个相互更新的属性:C# 两个属性相互更新,c#,C#,在一个类中,我有两个相互更新的属性:binary和value,其中binary是二进制值,value是10进制值。每种方法都会相互更新,以便在调用value的set方法时,binary会更新,反之亦然 private UInt64 _Binary; public UInt64 Binary { get { return _Binary; } set { if (_Binary != value) { _Binary = valu
binary
和value
,其中binary
是二进制值,value
是10进制值。每种方法都会相互更新,以便在调用value
的set
方法时,binary
会更新,反之亦然
private UInt64 _Binary;
public UInt64 Binary {
get { return _Binary; }
set
{
if (_Binary != value) {
_Binary = value;
BinaryToValue();
UpdateUi();
}
}
}
private double _Value;
public double Value {
get { return _Value; }
set
{
if (_Value != value) {
_Value = value;
ValueToBinary();
}
}
}
private void ValueToBinary() {
// Loop through and set each bit high or low as needed
}
如果当前的值
是一个十进制1
并且只有二进制的LSB设置为高,那么如果我将该值更改为6
,现在我将3位设置为不同的值,这意味着二进制的设置
方法每次看到不同的值(将位0设置为低(值=0),将位1设置为高)(value=2),将位2设置为高(value=4)。在这种情况下,BinaryToValue()
也被调用三次,所以当三个位中的每一位都被设置为不同的状态时,value
属性会发生变化,这不应该是因为value
属性最初包含了正确的值
如何防止这种情况发生
我不能更新备份字段,因为我需要在修改二进制文件时更新UI。我看了一下这个问题:,但这里的解决方案不适用,因为我不能只更新备份字段。正确的方法是只序列化一个,另一个只是执行相反操作的getterion作为它的调用(可能存储脏标志,如果性能是一个问题,则使用缓存值)。但是如果它们以不同的方式表示同一事物,则两者可能都不可设置。您可以提供以两种方式设置它的方法,但仅使用一个字段来存储值
如果您坚持这样做-只需在更新备份字段后调用UI update。您不能让属性彼此更新,因为这将导致循环正确的方法是只序列化一个,而另一个只是执行其调用的转换的getter(可能存储脏标志,如果性能是一个问题,则使用缓存值)。但如果它们以不同的方式表示同一事物,则两者可能都不可设置。您可以提供两种方式的设置方法,但只能使用一个字段来存储值
如果您坚持这样做-只需在更新备份字段后调用UI update即可。您不能让属性彼此更新,因为这将导致循环,正如Milney所说(如果您确实希望这样做),请仅为两个属性使用一个备份字段:
private UInt64 binary;
public UInt64 Binary { get { return binary; } set { binary = value; UpdateUi(); } }
public double Value { get { return BinaryToValue(); } set { ValueToBinary(value); } }
private double BinaryToValue()
{
double binaryToValue = 0;
// logic (convert binary field to double and set it to binaryToValue)
return binaryToValue;
}
private double lastValue;
private void ValueToBinary(double value)
{
if (value != lastValue)
{
lastValue = value;
// logic (Binary (the property to activate UpdateUi()) = ...)
}
}
您还可以删除Value
的setter,并按照米尔尼的建议将其设置为public
方法
注意:属性的唯一任务应该是获取和/或设置支持字段的值(验证其输入并通知更改情况),而不是更改另一个属性值(产生副作用),从而强化Milney对setter方法的建议。正如Milney所说(如果您真的想这样做的话),仅为两个属性使用一个支持字段:
private UInt64 binary;
public UInt64 Binary { get { return binary; } set { binary = value; UpdateUi(); } }
public double Value { get { return BinaryToValue(); } set { ValueToBinary(value); } }
private double BinaryToValue()
{
double binaryToValue = 0;
// logic (convert binary field to double and set it to binaryToValue)
return binaryToValue;
}
private double lastValue;
private void ValueToBinary(double value)
{
if (value != lastValue)
{
lastValue = value;
// logic (Binary (the property to activate UpdateUi()) = ...)
}
}
您还可以删除Value
的setter,并按照米尔尼的建议将其设置为public
方法
注意:属性的唯一任务应该是获取和/或设置支持字段的值(验证其输入并通知是否更改),而不是更改另一个属性值(产生副作用),加强了Milney对setter方法的建议。您可以只更新backing字段,然后更新UIWhy't\u Binary=someValue;UpdateUi();
工作?您可以只更新backing字段,然后更新UIWhy't\u Binary=someValue;UpdateUi();
工作?