gpt4 book ai didi

c# - .NET 中多次调用的 StringComparer.CurrentCultureIgnoreCase 效率

转载 作者:太空狗 更新时间:2023-10-30 00:50:38 25 4
gpt4 key购买 nike

我一直在使用 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 了)

最佳答案

根据reference source , OrdinalIgnoreCase 每次返回相同静态实例:

public abstract class StringComparer : ...
{
...

private static readonly StringComparer _ordinalIgnoreCase = new OrdinalComparer(true);

...

public static StringComparer OrdinalIgnoreCase {
get {
Contract.Ensures(Contract.Result<StringComparer>() != null);
return _ordinalIgnoreCase;
}
}

由于在实际的 .NET 可再发行组件中省略了 Contract.Ensures 调用,因此剩余的字段访问几乎肯定会被抖动内联。

(同样适用于 InvariantCulture、InvariantCultureIgnoreCase 和 Ordinal。)

另一方面,CurrentCulture 和 CurrentCultureIgnoreCase 确实会在您每次访问它们时返回新实例,因为当前文化可能会在两次访问之间发生变化。在这种情况下你应该缓存比较器吗?就个人而言,我不会让我的代码更复杂,除非分析表明存在问题。

不过,在这种特殊情况下,我通常会像这样比较字符串是否相等:

return String.Equals(this.a, other.a, StringComparison.OrdinalIgnoreCase);

现在您根本不必担心 StringComparer 分配问题,即使您使用 CurrentCulture 或 CurrentCultureIgnoreCase,代码仍然易于阅读。

关于c# - .NET 中多次调用的 StringComparer.CurrentCultureIgnoreCase 效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30684201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com