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);
}
}