string.Equals你真的会用吗?

4 阅读4分钟

核心结论是:string.Equals 的参数类型由你调用的重载版本决定,不同重载对参数类型的要求不同,且跨类型比较的逻辑需要特别注意。

图片

一、先明确 string.Equals 的核心重载版本

string 类提供了两个关键的静态 Equals 重载,直接决定了参数类型的兼容性:

| 重载版本

|

参数类型要求

|

核心逻辑

| | --- | --- | --- | | string.Equals(string a, string b) |

仅限 string 类型(或 null

|

专门用于比较两个字符串,是最常用的版本;传非 string 类型会编译报错

| | string.Equals(object objA, object objB) |

接受任意 object 类型

|

可传任意数据类型(int、double、自定义类型等),但仅当两个参数都是 string 且值相等时返回 true

|

二、分场景详细说明

场景1:调用 string.Equals(string a, string b)(最常用)

✅ 允许的参数:string 类型、nullnull 可视为 string 类型的空引用);
❌ 禁止的参数:直接传非 string 类型(如 int、double、bool、DateTime 等),会直接编译失败。

示例(编译报错)

// 错误:123 是 int 类型,无法匹配 string 类型参数
bool res1 = string.Equals(123456); 

// 错误:true 是 bool 类型,无法匹配 string 类型参数
bool res2 = string.Equals(truefalse); 

示例(合法,需显式转 string)
如果想比较其他类型的“字符串形式”,必须先通过 ToString() 等方式显式转换为 string

int numA123;
int numB123;
// 先转 string 再比较,返回 true
bool res3 = string.Equals(numA.ToString(), numB.ToString())

double dblA3.14;
// 比较 double 的字符串形式和字面量,返回 true
bool res4 = string.Equals(dblA.ToString(), "3.14")

场景2:调用 string.Equals(object objA, object objB)(接受任意类型)

✅ 允许的参数:任意数据类型(int、double、自定义类、null 等),编译不会报错;
⚠️ 核心坑点:仅当两个参数都是 string 类型且字符序列相等时,才返回 true;只要类型不同(哪怕“值的字符串形式相同”),结果都是 false

示例(直观理解)

// 示例1:参数类型不同(int vs string),即使值的字符串形式相同,返回 false
object a123; // int 类型
object b"123"; // string 类型
bool res5 = string.Equals(a, b); // false

// 示例2:两个都是非 string 类型(int vs int),返回 false
object c456;
object d456;
bool res6 = string.Equals(c, d); // false(不是 string 类型)

// 示例3:一个是 string,一个是 double,返回 false
object e"3.14";
object f3.14;
bool res7 = string.Equals(e, f); // false

// 示例4:两个都是 string 类型,返回 true(符合预期)
object g"hello";
object h"hello";
bool res8 = string.Equals(g, h); // true

// 示例5:其中一个是 null,返回 false
object i = null;
object j123;
bool res9 = string.Equals(i, j); // false

三、底层逻辑(为什么跨类型会返回 false)

string.Equals(object objA, object objB) 的执行流程:

  1. 先判断 objAobjB 是否都为 null → 返回 true

  2. 若其中一个为 null,另一个非 null → 返回 false

  3. 检查 objAobjB实际类型是否都是 string

  • 若不是 → 直接返回 false

  • 若是 → 转换为 string 后比较字符序列是否完全一致。

四、实际开发中的建议

  1. 不要依赖 string.Equals(object, object) 跨类型比较:哪怕你想比较“123”(int)和“123”(string),也不要靠这个重载,而是显式将非 string 类型转为 string 后,调用 string.Equals(string, string)
    ✅ 推荐写法:string.Equals(num.ToString(), "123")
    ❌ 不推荐写法:string.Equals((object)num, (object)"123")(结果不可控)

  2. 非 string 类型优先用自身的 Equals 方法:如果要比较 int、double 等类型的“值相等”,直接用其自身的 Equals 或 ==,而非 string.Equals;
    示例:123.Equals(123)3.14 == 3.14

  3. null 处理仍需注意:即使传其他类型,string.Equals(object, object)null 的处理是安全的(不会抛异常),但结果逻辑需符合预期(比如 string.Equals(null, null) 返回 true)。

总结

  • string.Equals(string a, string b)

    :仅接受 string 类型(或 null),传其他类型需显式转 string,否则编译报错;

  • string.Equals(object objA, object objB)

    :可传任意数据类型,但仅当两个参数都是 string 且值相等时返回 true,跨类型(哪怕值的字符串形式相同)都会返回 false

  • 实际开发中,若想比较非 string 类型的“字符串形式”,建议先通过 ToString() 显式转换为 string,再调用 string.Equals(string, string),逻辑更清晰、不易出错。

本文使用 文章同步助手 同步