A == B vs B == A,有什么区别

时间:2012-03-26 19:39:04

标签: c# java programming-languages

所以长话短说。一位教授在课堂上将这个问题作为一个讨论启动者。除了显而易见的

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 ++等等的语法....

不,这不是家庭作业。

5 个答案:

答案 0 :(得分:10)

在Java中,A == BB == A始终具有相同的语义。在C#(具有运算符重载)中,如果BA类的子类的实例,则会有所不同。

请注意,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!

因此,如果您有一个已知的常量值,它应该在表达式的左侧。