今天我偶然發現了一個我寫的有趣的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