假設我有一個通用的MyClass<T>
,需要比較<T>
類型的兩個對象。通常我會做這樣的事情......EqualityComparer <T>.Default與T.Equals
void DoSomething(T o1, T o2)
{
if(o1.Equals(o2))
{
...
}
}
現在假設我MyClass<T>
具有支持通過自定義IEqualityComparer<T>
,類似於Dictionary<T>
構造。在這種情況下,我需要做的......
private IEqualityComparer<T> _comparer;
public MyClass() {}
public MyClass(IEqualityComparer<T> comparer)
{
_comparer = comparer;
}
void DoSomething(T o1, T o2)
{
if((_comparer != null && _comparer.Equals(o1, o2)) || (o1.Equals(o2)))
{
...
}
}
要刪除這個漫長的if語句,它會是很好的,如果我能有_comparer
默認如果使用常規構造一個「默認的比較」。我搜索了像typeof(T).GetDefaultComparer()
之類的東西,但無法找到類似的東西。
我確實找到EqualityComparer<T>.Default
,我可以使用它嗎?而隨後將這個片段中......
public MyClass()
{
_comparer = EqualityComparer<T>.Default;
}
void DoSomething(T o1, T o2)
{
if(_comparer.Equals(o1, o2))
{
...
}
}
...提供相同的結果作爲使用o1.Equals(o2)
對所有可能的情況?
(作爲一個方面說明,這將意味着我還需要使用任何特殊的泛型約束的<T>
?)
注:可以按如下步驟做,如果'o1'爲null,'o1.Equals(O2)'將與無處不在的'NullReferenceException'失敗,而'EqualityComparer .Default.Equals(O1, o2)'會快樂地回報假。 –
2016-11-03 11:30:27
@ M.Stramm這就是爲什麼我說「我會做類似......的事情」,而不是「這是我的產品代碼......」;-) – takrl 2017-07-24 08:15:26