C#如何判断object类型是相等的

2025-03-05 13:47:55
推荐回答(4个)
回答1:

一般判断是否相等有两种意思:
一是值上的相等(只适合string),这种判断用string.equals(string),
另一种是==判断方式,这种是地址上的判断,判断俩个对象是否来自同一个地址,即:真正意义上的相等.
比如:string str="123"; string str2="123";
str.equals(str1)等于true;
str==str1就等于false;
你题上的s==t属于地址上的判断,应该是false.

回答2:

这里有两个关键的式子,s==t和s.Equals(t),下面我们来逐一分析

对于s==t,系统会调用object.Equals( object, object )这个静态方法:
public static bool Equals(object objA, object objB)
{
return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}
而object是引用类型,引用类型的变量,遇到等号运算符(==)时,依据内存地址判等
s和t两个值是在不同时刻由1装箱而来,所以地址不一样,所以objA == objB得到结果false,返回False

而对于s.Equals( t ),由于bool.Equals (object obj)实例方法是一个virtual(虚方法),所以在运行时会调用Int32.Equals(object obj):
public override bool Equals(object obj)
{
return ((obj is int) && (this == ((int) obj)));
}
s和t经过转换,得到了数字1,接着进行数字之间的等号运算,得到True

回答3:

object对象的equals方法是虚方法,意味着可以被子类覆盖。对于你提到的方法来说是因为在运行的时候CLR得知这是个int类型的比较,而且由于int类型内部覆盖了equals方法,但是equals方法内部调用的是int类型的重载的操作符“==”,所以上面的两个结果是相同的,因为其内部的实现是同样的。类似的还有string等。

回答4:

s == t对比的是对象object,
而Equals对比的是值,