所以长话短说。一位教授在课堂上将这个问题作为一个讨论启动者。除了显而易见的
B = new SomeClass("B"); // But B can be null, can can be new SomeClass("A");
A = new SomeClass("A");
A==B
在比较时会保证没有NPE,使用B == A而不是A == B的原因是什么?
A和B的类型相同,这与语言无关。所以你可以假设Java的A.equals(B),或C或C ++等等的语法....
不,这不是家庭作业。
答案 0 :(得分:10)
在Java中,A == B
和B == A
始终具有相同的语义。在C#(具有运算符重载)中,如果B
是A
类的子类的实例,则会有所不同。
请注意,A.equals(B)
不等同于A == B
。
答案 1 :(得分:3)
在C#中,运算符不能保证是可交换的,因为它们可以重载,因此A == B不一定会返回与B == A相同的结果。
E.g。
class Program
{
static void Main(string[] args)
{
var a = new MyClass("A");
var b = new MyClass("B");
Console.WriteLine(a == b);
Console.WriteLine(b == a);
Console.ReadLine();
}
public class MyClass
{
private string _Name;
public MyClass(string name)
{
if (_FirstInstance == null)
{
_FirstInstance = this;
}
this._Name = name;
}
private static MyClass _FirstInstance = null;
public static bool operator ==(MyClass left, MyClass right)
{
return object.ReferenceEquals(left, _FirstInstance);
}
public static bool operator !=(MyClass left, MyClass right)
{
return !(left == right);
}
}
是的,我意识到这是疯了。
答案 2 :(得分:1)
我认为你的意思是.equals
,而不是==
。如果a.equals(b)
为空,a
将抛出NPE,但如果b
为空,则抛出NPE。因此,如果您知道a
不为空,则应该a.equals(b)
而不是相反。
然而,不是,与语言无关。有些语言根本就没有空格!
答案 3 :(得分:1)
在java中,你可以做A == B或B == A并且你不会获得NPE。真正的问题是当你做
时String s = ...;
boolean isNull = s.equals("myString");
而不是
boolean isNull = "myString".equals(s);
因为您正在调用某个对象上的方法,并且" myString"是一个正确实例化的对象,然后第二个调用将永远不会抛出NPE,无论变量" s"是或否。你没有通过第一次通话获得保证,因为你不确定" ..."在" s"的右侧赋值是" yourString"或null。
答案 4 :(得分:0)
在Java中
Object a = new Object();
Object b = null;
System.out.println(a.equals(b)); //false
System.out.println(b.equals(a)); //NPE!
因此,如果您有一个已知的常量值,它应该在表达式的左侧。