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();
工作?