You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类内外对象比较问题:为何部分相等判断逻辑失效?

为何Movie对象比较会出现不同结果?

场景说明

我定义了两个类:

  • Movie类:包含string name属性
  • Festival类:包含Movie[] movies属性

1. 正常工作的Exist方法

在Festival类内部编写的Exist方法,用于判断Movie mv是否存在于movies数组中,代码运行正常:

public bool Exist(Movie mv)
{
    foreach (Movie movie in movies)
    {
        if (mv == movie)
        {
            return true;
        }
    }
    return false;
}

当mv存在于movies中时返回true,不存在时返回false。

2. 始终返回false的两种Check方法

在Program类中编写Check方法,用于判断两个Festival对象是否有共同的Movie,以下两种写法始终返回false:

写法一:用==比较

public static bool Check(Festival f1, Festival f2)
{
    foreach (Movie movie1 in f1.GetMovies()) // 返回Festival的movies属性
    {
        foreach (Movie movie2 in f2.GetMovies())
        {
            if (movie2 == movie1)
            {
                return true;
            }
        }
    }
    return false;
}

写法二:用Object.Equals比较

public static bool Check(Festival f1, Festival f2)
{
    foreach (Movie movie1 in f1.GetMovies())
    {
        foreach (Movie movie2 in f2.GetMovies())
        {
            if (movie2.Equals(movie1))
            {
                return true;
            }
        }
    }
    return false;
}

3. 正常工作的写法:比较name属性

只有通过GetName()方法比较两个Movie对象的name属性时,方法才正常工作:

public static bool Check(Festival f1, Festival f2)
{
    foreach (Movie movie1 in f1.GetMovies())
    {
        foreach (Movie movie2 in f2.GetMovies())
        {
            if (movie2.GetName() == movie1.GetName())
            {
                return true;
            }
        }
    }
    return false;
}

原因解析

  1. 引用类型的默认比较规则:C#中自定义引用类型(比如Movie)的默认==运算符和Object.Equals方法,比较的是对象的内存引用地址,而非对象的内容。
  2. Exist方法正常的原因:调用Exist时传入的mv参数,本身就是当前Festival的movies数组中某个对象的引用——mv和数组里的movie指向同一个内存地址,所以==比较会返回true。
  3. Check方法失败的原因:f1和f2的movies数组中的Movie对象,即使name完全相同,也是两个独立创建的实例,内存地址不同,因此默认的==和Object.Equals会判断为不相等,返回false。
  4. 比较name正常的原因:string类型虽是引用类型,但C#对字符串做了特殊处理(字符串驻留池),==运算符会直接比较字符串的内容而非引用地址,因此能正确判断两个Movie是否为“同一个电影”(按name标识)。

内容的提问来源于stack exchange,提问作者Ariel Oz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 01:45:34