我一直在使用StringComparer.CurrentCultureIgnoreCase
不区分大小写的比较和散列。但是在检查了参考源之后,我看到它在每次调用时都会创建一个新实例(那么它不应该是一个静态函数吗?只是为了形式)。无论如何,我的问题是,当您要进行多次比较时,例如IEquality<T>
实现,这样做是否有效:
// 2 instances per call
return StringComparer.CurrentCultureIgnoreCase.Equals(this.a, other.a)
&& StringComparer.CurrentCultureIgnoreCase.Equals(this.b, other.b) .. etc ..
或者可能:
public bool Equals(MyObj other)
{
// 1 instance per call
var equ = StringComparer.CurrentCultureIgnoreCase;
return equ.Equals(this.a, other.a)
&& equ.Equals(this.b, other.b) .. etc ..
}
或者甚至缓存/汇集比较器,以便每次Equals()
调用时都不会创建它们?
// 1 instance per thread
[ThreadStatic]
private static StringComparer equ;
public bool Equals(MyObj other)
{
if (equ == null) equ = StringComparer.CurrentCultureIgnoreCase;
return equ.Equals(this.a, other.a)
&& equ.Equals(this.b, other.b) .. etc ..
}
有什么感觉是最佳实践吗?
(感谢 michael-liu 指出对 OrdinalIgnoreCase 的原始引用不是一个新实例,我已经切换到 CurrentCultureIgnoreCase 是)