文章

StringComparison 使用手册

StringComparison 使用手册

StringComparison 使用手册

1. 性能对比

一般情况下, 性能从高到低大致如下:

1
2
3
4
5
6
Ordinal
OrdinalIgnoreCase
InvariantCulture
InvariantCultureIgnoreCase
CurrentCulture
CurrentCultureIgnoreCase

说明:

  • Ordinal 最快, 只按字符编码比较。
  • OrdinalIgnoreCase 需要额外处理大小写, 但仍然不依赖区域文化, 性能较好。
  • InvariantCulture / InvariantCultureIgnoreCase 使用固定文化规则, 比 Ordinal 慢。
  • CurrentCulture / CurrentCultureIgnoreCase 依赖当前系统或线程文化规则, 通常最慢。

2. 实际使用建议

2.1 程序内部标识符, Key, 配置项

推荐:

1
2
StringComparison.Ordinal
StringComparison.OrdinalIgnoreCase

适用场景:

  • 配置 Key
  • Shader 属性名
  • 文件扩展名
  • 字典 Key
  • 协议字段
  • 内部枚举字符串
  • 路径片段匹配
  • Unity 对象命名规则匹配

建议:

1
string.Equals(a, b, StringComparison.Ordinal)

或:

1
string.Equals(a, b, StringComparison.OrdinalIgnoreCase)

如果业务不需要语言文化规则, 优先使用 Ordinal 系列。


2.2 面向用户显示文本的搜索和排序

推荐:

1
2
StringComparison.CurrentCulture
StringComparison.CurrentCultureIgnoreCase

适用场景:

  • 用户输入搜索
  • UI 文本排序
  • 本地化文本比较
  • 需要符合用户语言习惯的字符串处理

注意:

CurrentCulture 会受到当前系统语言环境影响。不同语言环境下, 比较结果可能不同。


2.3 需要固定文化规则, 但不是纯编码比较

推荐:

1
2
StringComparison.InvariantCulture
StringComparison.InvariantCultureIgnoreCase

适用场景:

  • 跨区域数据处理
  • 固定规则的文本比较
  • 不希望受用户系统语言影响, 但又需要文化感知比较

注意:

InvariantCulture 不是最高性能选择。若只是比较程序内部 Key, 通常仍应优先使用 Ordinal


3. 参数说明

3.1 Ordinal

1
StringComparison.Ordinal

含义:

按字符的 Unicode 编码值直接比较。

特点:

  • 区分大小写。
  • 不考虑任何语言文化规则。
  • 结果稳定, 不受系统语言影响。
  • 性能最好。

示例:

1
string.Equals("Alpha", "alpha", StringComparison.Ordinal); // false

适合:

  • 程序内部标识符
  • Key
  • 路径
  • Shader 属性名
  • 文件扩展名
  • 协议字段

3.2 OrdinalIgnoreCase

1
StringComparison.OrdinalIgnoreCase

含义:

忽略大小写, 但仍然按 Unicode 编码规则比较。

特点:

  • 不区分大小写。
  • 不考虑当前语言文化。
  • 结果稳定。
  • 性能较好。

示例:

1
string.Equals("Alpha", "alpha", StringComparison.OrdinalIgnoreCase); // true

适合:

  • 不区分大小写的内部 Key
  • 文件扩展名比较
  • 命令字符串
  • 标签字符串
  • 稳定的工具逻辑

推荐示例:

1
2
3
4
if (name.EndsWith(".json", StringComparison.OrdinalIgnoreCase))
{
    // ...
}

3.3 CurrentCulture

1
StringComparison.CurrentCulture

含义:

使用当前线程或系统文化规则进行比较。

特点:

  • 区分大小写。
  • 受当前语言环境影响。
  • 适合用户可见文本。
  • 不适合程序内部 Key。

示例:

1
string.Equals(a, b, StringComparison.CurrentCulture);

适合:

  • UI 文本
  • 用户输入
  • 本地化文本排序
  • 需要符合当前语言习惯的比较

3.4 CurrentCultureIgnoreCase

1
StringComparison.CurrentCultureIgnoreCase

含义:

使用当前文化规则进行比较, 并忽略大小写。

特点:

  • 不区分大小写。
  • 受当前语言环境影响。
  • 在不同语言环境下结果可能不同。

示例:

1
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);

适合:

  • 用户输入搜索
  • UI 文本匹配
  • 本地化文本比较

注意:

土耳其语等语言对大小写有特殊规则。使用该方式时, "i""I" 的比较结果可能与英语环境不同。


3.5 InvariantCulture

1
StringComparison.InvariantCulture

含义:

使用固定的、不随用户系统语言变化的文化规则进行比较。

特点:

  • 区分大小写。
  • 不受当前系统语言影响。
  • Ordinal 更偏向语言规则。
  • 性能低于 Ordinal

示例:

1
string.Equals(a, b, StringComparison.InvariantCulture);

适合:

  • 需要固定文化规则的文本处理
  • 跨区域但仍需要文化感知的比较

不推荐用于:

  • 内部 Key
  • Shader 属性名
  • 协议字段
  • 配置字段

这些场景通常应使用 Ordinal


3.6 InvariantCultureIgnoreCase

1
StringComparison.InvariantCultureIgnoreCase

含义:

使用固定文化规则进行比较, 并忽略大小写。

特点:

  • 不区分大小写。
  • 不受当前系统语言影响。
  • OrdinalIgnoreCase 更偏向语言规则。
  • 性能低于 OrdinalIgnoreCase

示例:

1
string.Equals(a, b, StringComparison.InvariantCultureIgnoreCase);

适合:

  • 需要固定文化规则, 且忽略大小写的文本比较。
  • 不希望比较结果受用户语言环境影响的文化感知文本处理。

4. 快速选择表

场景推荐值
内部 Key, 标识符, Shader 属性名, 协议字段Ordinal
内部 Key, 但忽略大小写OrdinalIgnoreCase
用户可见文本比较CurrentCulture
用户可见文本比较, 忽略大小写CurrentCultureIgnoreCase
固定文化规则比较InvariantCulture
固定文化规则比较, 忽略大小写InvariantCultureIgnoreCase

5. 常用代码示例

5.1 精确比较内部字符串

1
2
3
4
if (string.Equals(propertyName, "_BaseColor", StringComparison.Ordinal))
{
    // ...
}

5.2 忽略大小写比较扩展名

1
2
3
4
if (path.EndsWith(".json", StringComparison.OrdinalIgnoreCase))
{
    // ...
}

5.3 用户输入搜索

1
2
3
4
if (displayName.Contains(keyword, StringComparison.CurrentCultureIgnoreCase))
{
    // ...
}

6. 总结

优先级建议:

1
2
3
程序内部逻辑: Ordinal / OrdinalIgnoreCase
用户可见文本: CurrentCulture / CurrentCultureIgnoreCase
固定文化规则: InvariantCulture / InvariantCultureIgnoreCase

工程中最常用的选择通常是:

1
2
StringComparison.Ordinal
StringComparison.OrdinalIgnoreCase

除非明确需要用户语言文化规则, 否则不要默认使用 CurrentCulture

本文由作者按照 CC BY 4.0 进行授权