【发布时间】:2011-09-06 11:54:16
【问题描述】:
今天我偶然发现了我写的一个有趣的错误。我有一组可以通过通用设置器设置的属性。这些属性可以是值类型或引用类型。
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 似乎有点矫枉过正。没有更简单的方法吗?
【问题讨论】:
-
当然,如果您想要盒装值的不同行为,那么您需要检查您是否正在处理盒装值?
-
使用 T 类型对该方法进行泛型重载,其中 T : struct
-
@lukas,除非有比
T和约束更多的区别,否则将不起作用。 -
我的意思是:把它分成两种方法。一个处理 ref 类型,另一个处理每个函数中的值类型和相应的逻辑。 @Steven 我有一个想法,但它非常危险。我的意思是我没有尝试过:P 如果您使用的是 C# 4.0,请使用对象的动态 insted。我假设你有一些性能理由去做你所做的事情,但这可能已经足够好了。
标签: c# equality boxing unboxing