【发布时间】:2011-05-03 16:07:50
【问题描述】:
假设我有一个通用的MyClass<T>,它需要比较两个<T> 类型的对象。通常我会做类似...
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,我可以使用它吗?然后这个 sn-p ...
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<T>.Default.Equals(o1, o2)将很高兴返回false。 -
@M.Stramm 这就是为什么我说“我会做类似......”,而不是“这是我的生产代码......”;-)
标签: c# .net generics comparison iequalitycomparer