給定一個C#中的對象實例,如何確定該對象是否具有值語義?換句話說,我想保證我的API中使用的對象適合用作字典鍵。我在想這樣的事情:確定一個實例已覆蓋GetHashCode和Equals?
var type = instance.GetType();
var d1 = FormatterServices.GetUninitializedObject(type);
var d2 = FormatterServices.GetUninitializedObject(type);
Assert.AreEqual(d1.GetHashCode(), d2.GetHashCode());
你對這種方法有什麼看法?
你可以把基於'IEquatable'通用約束。 –
MarcinJuraszek
具有默認引用等式的類型非常適合Dictionary鍵。 –
更簡單:'instance.GetHashCode()== RuntimeHelpers.GetHashCode(instance)'。它告訴返回的哈希碼是否與未重寫的'對象'實現使用的哈希碼相同。不過,對於值類型來說,這並不太有意義,但應該可以工作(新框的哈希代碼)。請注意,哈希碼相同可能是一個「意外」(偶然)。 –