假设我有一个通用的
为了去掉这个冗长的if语句,如果我可以让
我确实发现了
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
,我能用它吗?然后这段代码会怎样……public MyClass()
{
_comparer = EqualityComparer<T>.Default;
}
void DoSomething(T o1, T o2)
{
if(_comparer.Equals(o1, o2))
{
...
}
}
使用o1 == o2
是否可以在所有情况下提供与使用o1.Equals(o2)
相同的结果?
(顺带一提,这是否意味着我还需要使用任何特殊的泛型约束来限制<T>
?)
o1
是 null,o1.Equals(o2)
将会失败并抛出普遍存在的NullReferenceException
,而EqualityComparer<T>.Default.Equals(o1, o2)
则可以愉快地返回 false。 - M.Stramm