让我们说我们有两个对象o1& o2定义为System.Object,在我的坐标o1& o2可以是以下任何一种类型:
那么如何检查o1& o2是相同的,因此是相同的对象或两者具有相同的类型&值。
我可以o1 == o2
或者我需要o1.Equals(o2)
或其他吗?
谢谢,
AJ
答案 0 :(得分:20)
我建议你使用
object.Equals(o1, o2)
因为这也将应对无效。 (假设您希望两个空引用比较相等。)
您应该不使用==
,因为运算符不是多态应用的;类型重载 ==但他们没有覆盖它(没有什么可以覆盖)。如果你使用
o1 == o2
将比较引用标识,因为变量被声明为object
类型。
在o1.Equals(o2)
为空的情况下,使用o1
将除了,此时它会抛出NullReferenceException
。
答案 1 :(得分:4)
运算符==按引用比较对象,方法等于按值比较对象 例如:
StringBuilder s1 = new StringBuilder(“Yes”);
StringBuilder s2 = new StringBuilder(“Yes”);
Console.WriteLine(s1 == s2);
Console.WriteLine(s1.Equals(s2));
将显示:
False
True
可以通过==或Equals来比较值对象。
答案 2 :(得分:1)
我会使用Object.Equals(o1,o2)
- 参考。 MSDN
Jon提供了很好的解释,说明为什么这将是最佳用法。
答案 3 :(得分:1)
'Equals'应适用于字符串和您列出的值类型。
'=='对于类似下面的代码的内容会失败,因为对盒装对象的引用不一样:
int x = 1;
int y = 1;
Object o1 = x;
Object o2 = y;
编辑: 我注意到上面给出的stringbuilder示例,但由于您使用字符串并且它们的等式运算符被覆盖,它们实际上可以使用“==”或“.Equals”,以下代码
string s1 =“是”;
string s2 =“是”;
Console.WriteLine(s1 == s2);
Console.WriteLine(s1.Equals(S2));
输出 真正 真
答案 4 :(得分:0)
object.Equals(obj1, obj2) // This is the way prefered and the best practice for equality comparison.
因此,在使用自定义对象时,您可能还会考虑覆盖Equals方法(这里不是这种情况)。
public class Something {
public long Id { get; set; }
public string Name { get; set; }
public override bool Equals(object obj) {
if (obj == null)
return false;
if (((Something)obj) == null)
return false;
Something s = (Something)obj;
return this.Id == s.Id && string.Equals(this.Name, s.Name);
}
public bool Equals(Something s) {
if (s == null)
return false;
return this.Id == s.Id && string.Equals(this.Name, s.Name);
}
}
这样,您可以确保自定义对象相同。