這是不好的編程習慣嗎?
實施IEquatable<T>
是偉大的,更是這樣的結構,但僅僅這樣做多是不夠的。
我讀過,我還需要實現的Object.Equals
Read it here why..
和Object.GetHashCode爲好,但我不知道爲什麼。
Read it here和here。嚴重的是,這些都已經討論過很多次,這是非常簡單的。總之,你需要它與像Dictionary<,>
或HashSet<>
哈希涉及集合類型我希望能夠檢查一個實例的MyClass尚未包含在MyClass類型的通用列表中。爲什麼框架只會建議你只實現Equals?
取決於集合類型。對於List<T>
,它只會根據您如何定義Equals
方法來檢查相等性,例如對於Contains
方法。對於大多數情況下,您只需要Equals
。但是如果你有一個HashSet<T>
那麼缺席和在場檢查將利用你的對象的散列。框架確實要求我們實施良好的散列方法(無需重新發明輪子)at appropriate places。
任何幫助將不勝感激。
做如下,但你必須重載運算符==
和!=
只有當它是有意義的你。看到你的班級,我假設你的班級具有價值語義。否則,只需忽略該部分(如果==
應該表示引用相等)......從您的GUID獲取哈希碼就足夠了,前提是您只需測試相等性。
public sealed class MyClass : IEquatable<MyClass>
{
Guid m_id = Guid.NewGuid();
public Guid Id { get { return m_id; } }
public bool Equals(MyClass other)
{
if (ReferenceEquals(this, other))
return true;
if (ReferenceEquals(null, other))
return false;
return Id == other.Id;
}
public override bool Equals(object obj)
{
return Equals(obj as MyClass);
}
public static bool operator ==(MyClass lhs, MyClass rhs)
{
if (ReferenceEquals(lhs, null))
return ReferenceEquals(rhs, null);
return lhs.Equals(rhs);
}
public static bool operator !=(MyClass lhs, MyClass rhs)
{
return !(lhs == rhs);
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
}
要不要搞錯了,利用現有的片段here的:對於一個很好的概述see this SO thread.
的實施可以縮短爲:'返回this.Id == other.Id;' 。 – Oded 2012-01-09 11:06:34
[是否有完整的IEquatable實現引用?](http://stackoverflow.com/questions/1307493/is-there-a-complete-iequatable-implementation-reference)可能的重複。另外,請查看[瞭解IEquatable](http://stackoverflow.com/questions/411500/understanding-iequatable)。 – Groo 2012-01-09 11:07:17
@Oded如果_other_爲null,該怎麼辦? :) – 2012-01-09 11:17:28