今天我偶然发现了一个我写的有趣的bug。我有一套属性可以通过一个普通的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似乎有点矫枉过正。没有更简单的方法吗?
当然,如果你想不同行为的盒装值,那么你将需要检查你是否正在处理盒装值? – LukeH 2011-06-01 17:19:39
使用类型T对此方法进行泛型重载,其中T:struct – 2011-06-01 17:23:56
@lukas将不起作用,除非存在更多与“T”和约束不同的区别。 – 2011-06-01 17:29:43