gpt4 book ai didi

c# - 比较盒装值类型

转载 作者:IT王子 更新时间:2023-10-29 04:05:08 24 4
gpt4 key购买 nike

今天我偶然发现了我写的一个有趣的错误。我有一组可以通过通用 setter 设置的属性。这些属性可以是值类型或引用类型。

public void SetValue( TEnum property, object value )
{
if ( _properties[ property ] != value )
{
// Only come here when the new value is different.
}
}

在为此方法编写单元测试时,我发现条件对于值类型始终为真。没过多久我就发现这是由于 boxing/unboxing 造成的。 .我也没有花很长时间将代码调整为以下内容:

public void SetValue( TEnum property, object value )
{
if ( !_properties[ property ].Equals( value ) )
{
// Only come here when the new value is different.
}
}

问题是我对这个解决方案并不完全满意。我想保留一个简单的引用比较,除非值被装箱。

我目前想到的解决方案只是为装箱值调用 Equals()。做a check for a boxed values似乎有点矫枉过正。有没有更简单的方法?

最佳答案

如果您在处理值类型时需要不同的行为,那么您显然需要执行某种测试。您不需要显式检查装箱值类型,因为所有值类型都将装箱**,因为参数类型为 object。 .

此代码应符合您规定的标准:如果 value是一个(盒装的)值类型然后调用多态的Equals方法,否则使用 ==测试引用相等性。

public void SetValue(TEnum property, object value)
{
bool equal = ((value != null) && value.GetType().IsValueType)
? value.Equals(_properties[property])
: (value == _properties[property]);

if (!equal)
{
// Only come here when the new value is different.
}
}

( ** 而且,是的,我知道 Nullable<T> 是一个值类型,它有自己关于装箱和拆箱的特殊规则,但这在这里几乎无关紧要。)

关于c# - 比较盒装值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6205029/

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