类内外对象比较问题:为何部分相等判断逻辑失效?
为何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; }
原因解析
- 引用类型的默认比较规则:C#中自定义引用类型(比如
Movie)的默认==运算符和Object.Equals方法,比较的是对象的内存引用地址,而非对象的内容。 - Exist方法正常的原因:调用
Exist时传入的mv参数,本身就是当前Festival的movies数组中某个对象的引用——mv和数组里的movie指向同一个内存地址,所以==比较会返回true。 - Check方法失败的原因:
f1和f2的movies数组中的Movie对象,即使name完全相同,也是两个独立创建的实例,内存地址不同,因此默认的==和Object.Equals会判断为不相等,返回false。 - 比较name正常的原因:
string类型虽是引用类型,但C#对字符串做了特殊处理(字符串驻留池),==运算符会直接比较字符串的内容而非引用地址,因此能正确判断两个Movie是否为“同一个电影”(按name标识)。
内容的提问来源于stack exchange,提问作者Ariel Oz
相关产品推荐
相关产品推荐

