直接用 == 或 string.Equals 比较字符串通常安全高效;需忽略大小写、处理 null 或文化敏感比较时,必须显式指定 StringComparison 枚举值,否则易引发隐蔽 bug。

直接用 string.Equals 或 == 比较两个字符串,绝大多数场景下是安全且高效的;但如果你需要忽略大小写、处理 null、或做文化敏感比较,就得选对方法,否则会出隐蔽 bug。
用 == 还是 string.Equals?
== 在 C# 中对 string 是重载过的,语义等价于 string.Equals(a, b, StringComparison.Ordinal) —— 即逐字节比对,区分大小写、不依赖区域设置。它简洁,也支持 null 安全(null == null 返回 true,"abc" == null 返回 false)。
string.Equals 更灵活,能显式指定比较方式,适合需要控制行为的场景:
- 要忽略大小写:用
StringComparison.OrdinalIgnoreCase - 要按当前文化规则比较(比如土耳其语中 ‘i’ 的大小写规则特殊):用
StringComparison.CurrentCulture - 做文件路径、HTTP header、XML 属性等系统级字符串比对:必须用
StringComparison.Ordinal或OrdinalIgnoreCase,避免文化相关歧义 - 传入可能为
null的变量时,推荐用静态string.Equals(a, b, ...),而非a.Equals(b),防止 NullReferenceException
常见错误:把 string.Compare 当作相等判断
string.Compare 返回 int(负数/0/正数),不是布尔值。新手常误写成:
if (string.Compare(a, b) == true) // ❌ 编译不过
或更危险的:
if (string.Compare(a, b)) // ❌ 隐式转换失败,编译报错
正确写法是:
if (string.Compare(a, b, StringComparison.Ordinal) == 0) // ✅ 显式判断是否相等
但注意:string.Compare 主要用于排序(如 IComparer),不是判断相等的首选。它比 Equals 多一层开销,且易读性差。
实际项目中怎么选?看这三点
你写的代码跑在哪?用户是谁?字符串从哪来?这三个问题决定比较方式:
- 用户输入的姓名、地址搜索:用
StringComparison.CurrentCultureIgnoreCase,符合本地人直觉 - 数据库主键、JWT token、JSON 字段名:一律用
StringComparison.Ordinal,避免不同服务器文化设置导致行为不一致 - 配置文件里的开关项(如
"enabled"/"DISABLED"):用StringComparison.OrdinalIgnoreCase,简单可靠 - 任何涉及
Dictionary的 key 查找:构造字典时必须指定StringComparer.Ordinal或对应变体,否则默认用CurrentCulture,上线后可能查不到 key
附:一个最小可运行对比示例
以下代码演示了四种常见场景,可直接粘贴进 .NET 6+ 控制台项目验证:
string a = "Hello"; string b = "HELLO"; string c = null; <p>Console.WriteLine(string.Equals(a, b)); // False(默认 Ordinal) Console.WriteLine(string.Equals(a, b, StringComparison.OrdinalIgnoreCase)); // True Console.WriteLine(string.Equals(a, c)); // False(安全) Console.WriteLine(string.Equals(c, c)); // True(null == null 成立)</p>
别忘了:如果项目里大量用到忽略大小写的比较,建议封装一个扩展方法,比如 .IsEqualIgnoreCase(),但内部仍调用 string.Equals(x, y, OrdinalIgnoreCase) —— 不要用 ToLowerCase() 再比,那会额外分配字符串对象,影响性能。
文化敏感比较看着“更智能”,但在服务端、跨区域部署、或做哈希/字典 key 时,恰恰是最容易翻车的地方。











