Jon*_*eet 51
假设类型a和b是引用类型:
在Java中,==将始终比较标识 - 即两个值是否是对同一对象的引用.这也称为引用相等.Java没有任何用户定义的运算符重载.
在C#中它取决于.除非有一个处理它的重载运算符,否则==将表现得像Java(即比较引用相等).但是,如果有相匹配的过载编译时类型的a和b(例如,如果他们都声明为字符串),那么超载将被调用.这可以表现怎么想的,但它通常实现的值相等(即a和b可参照不同,但相同的值,它仍然会返回true).
在两种语言中,a.Equals(b)或a.equals(b)将调用由声明的虚拟Equals/ equals方法Object,除非编译时类型引入了更具体的重载a.这可能会或可能不会在a引用的对象的执行时类型中被覆盖.在.NET和Java中,实现Object也检查身份.请注意,这取决于执行时类型,而不是重载决策所依赖的编译时类型.
当然,如果a是null,那么你会得到一个NullReferenceException/ NullPointerException当您尝试调用a.equals(b)或a.Equals(b).
TSt*_*per 13
在==操作符检查是否两个对象是完全一样的对象,它是不是在大多数情况下要走的路.该的Equals方法将能够在内部比较两种对象
例:
class Mycar
{
string color;
Mycar(string str)
{
color = str;
}
}
Mycar a = new Mycar("blue");
Mycar b = new Mycar("blue");
a==b // Returns false
a.Equals(b) // Returns true
Run Code Online (Sandbox Code Playgroud)