C# .net对象相等性
假设我们有两个对象o1和o2被定义为System。对象,在我的情况下o1和o2可以是以下任何类型:C# .net对象相等性,c#,.net,C#,.net,假设我们有两个对象o1和o2被定义为System。对象,在我的情况下o1和o2可以是以下任何类型: 串 Int32 双重的 布尔值 日期时间 DBNull 那么我如何检查o1和o2是相等的,因此是相同的对象,或者两者具有相同的类型和值 我可以只做o1==o2吗,或者我需要做o1.Equals(o2)或者其他什么吗 谢谢 AJ我建议您使用 object.Equals(o1, o2) 因为这也将解决无效问题。(假设您希望两个空引用进行相等的比较。) 您不应该使用==,因为运算符不是多态应用的;
- 串
- Int32
- 双重的
- 布尔值
- 日期时间
- DBNull
o1==o2
吗,或者我需要做o1.Equals(o2)
或者其他什么吗
谢谢
AJ我建议您使用
object.Equals(o1, o2)
因为这也将解决无效问题。(假设您希望两个空引用进行相等的比较。)
您不应该使用==
,因为运算符不是多态应用的;类型重载==但它们不重写它(没有什么可重写的)。如果你使用
o1 == o2
这将比较它们的引用标识,因为变量被声明为object
类型
使用
o1.Equals(o2)
将起作用,除非o1
为空-此时它将抛出NullReferenceException
我将使用对象.Equals(o1,o2)
-ref
Jon很好地解释了为什么这是最好的用法。操作符==通过引用比较对象,方法等于通过值比较对象。
例如:
StringBuilder s1 = new StringBuilder(“Yes”);
StringBuilder s2 = new StringBuilder(“Yes”);
Console.WriteLine(s1 == s2);
Console.WriteLine(s1.Equals(s2));
将显示:
False
True
值对象可以通过==或Equals进行比较。'Equals'应该适用于字符串和列出的值类型 “==”将失败,原因是对装箱对象的引用不相同:
int x = 1;
int y = 1;
Object o1 = x;
Object o2 = y;
编辑:
我注意到上面给出的stringbuilder示例,但是由于您使用的是字符串,并且它们的相等运算符被覆盖,因此它们实际上可以使用“==”或“.Equals”来工作,下面的代码
字符串s1=“是”
字符串s2=“是”
Console.WriteLine(s1==s2)
控制台写入线(s1等于(s2))
输出
真的
真的
因此,您也可以考虑在使用自定义对象时重写ErrAs方法(而不是在这里出现的情况)。
这样,您就可以确保自定义对象是相等的。我想我应该在完成答案之前刷新答案。:)+1.
object.Equals(obj1, obj2) // This is the way prefered and the best practice for equality comparison.
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);
}
}