C# A==B和B==A有什么区别

C# A==B和B==A有什么区别,c#,java,programming-languages,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属于同一类型,这与语言无关。因此,可以假定A.java(相等)(b),或者C或C++等的语法……/P> 不,这不是家庭作业。我想你的意思是

长话短说。一位教授在课堂上提出这个问题作为讨论的开始。除了显而易见的

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属于同一类型,这与语言无关。因此,可以假定A.java(相等)(b),或者C或C++等的语法……/P>
不,这不是家庭作业。

我想你的意思是
.equals
,而不是
=
<如果
a
为空,则code>a.equals(b)将抛出NPE,但如果
b
为空,则不会抛出NPE。因此,如果您知道
a
不为空,则应该执行
a.equals(b)
,而不是相反


然而,这不是独立于语言的。有些语言根本没有空值

在Java中,
A==B
B==A
总是具有相同的语义。在C#(具有运算符重载)中,如果说
B
a
类的一个子类的实例,则可能存在差异


请注意,
A.equals(B)
并不等同于
A==B
在java中,您可以执行A==B或B==A,而不会获得NPE。真正的问题是当你这样做的时候

String s = ...;
boolean isNull = s.equals("myString");
而不是

boolean isNull = "myString".equals(s);
由于您正在对一个对象调用一个方法,并且“myString”是一个正确实例化的对象,那么无论变量“s”是否为null,第二次调用都不会抛出NPE。第一次调用并不能保证,因为您不确定“s”赋值右侧的“…”是“yourString”还是null

Object a = new Object();
Object b = null;
System.out.println(a.equals(b));  //false
System.out.println(b.equals(a));  //NPE!
因此,如果您有一个已知的常量值,它应该位于表达式的左侧。

在C#中,运算符不能保证是可交换的,因为它们可以重载,因此a==B不一定返回与B==a相同的结果

例如


是的,我意识到这太疯狂了。

您的每种场景和语言都有一个非常不同的答案。使用
=
(假设它没有过载)不会加入C。为什么同时标记Java和C?在Java中,
=
永远不会抛出NEP。很多时候,如果B是常数,人们会执行B==A。这背后的想法是,捕捉这样一种情况:您不小心在语句中放入了一个“=”,导致赋值而不是检查。在某些语言中,运行的代码最终可能会有所不同,这取决于您是执行A==B还是B==A(假设A和B属于两种不同的类型,它们都重载了==运算符,或者如果通过.Equals实现,则A和B可能具有不同的.Equals()@NullUserException可能与这个问题无关,但是当涉及自动装箱/取消装箱时,Java
=
可以抛出一个NPE。这是一个显而易见的原因,这就是a被初始化的原因。这是一个显而易见的原因,以确保没有NPE,但还有什么其他原因是我正在寻找的。我已经和许多人谈过,他们不能想出一个NPE,一个教授没有说。所以我很好奇是否有。即使在你编辑的示例中,也没有NPE的风险,因为你没有对可能的空引用调用方法,你只是比较两个引用,看看它们是否相同。在Java中,顺序与“==”无关。我实际上在寻找更多的东西,但没有考虑到C#==有重载,但我将测试子类示例。但这是我没有考虑到的。@Churk-平等测试的危险之一(与测试身份相反)子类可能对等式有不同的想法,这很容易破坏交换性。没有好的方法可以解决这个问题。
    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);
    }
}