更新: Roslyn编译器已更新,以在 没有重载的相等运算符时
使两个运算符的行为相同。请查看当前编译器结果(
M1和
M2代码)中的代码,该代码显示了没有重载的相等比较器时发生的情况。他们俩现在都表现得更好
==。如果存在相等的比较器超载,则代码仍然不同。
有关较旧版本的Roslyn编译器,请参见以下分析。
因为
null与使用C#6的习惯没有什么不同。但是,当您更改
null为另一个常量时,事情变得很有趣。
以这个为例:
Test(1);public void Test(object o){ if (o is 1) Console.WriteLine("a"); else Console.WriteLine("b");}
测试合格
a。如果将其与
o == (object)1正常编写的内容进行比较,那确实会有所不同。
is考虑比较另一侧的类型。太棒了!
我认为
== nullvs.
is null常量模式只是“偶然”非常熟悉的事情,其中
is运算符和equals运算符的语法产生相同的结果。
作为svick评论,
isnull呼吁
System.Object::Equals(object,object)地方
==调用
ceq。
ILis
:
IL_0000: ldarg.1 // Load argument 1 onto the stackIL_0001: ldnull // Push a null reference on the stackIL_0002: call bool [mscorlib]System.Object::Equals(object, object) // Call method indicated on the stack with argumentsIL_0007: ret // Return from method, possibly with a value
IL==
:
IL_0000: ldarg.1 // Load argument 1 onto the stackIL_0001: ldnull // Push a null reference on the stackIL_0002: ceq // Push 1 (of type int32) if value1 equals value2, else push 0IL_0004: ret // Return from method, possibly with a value
既然我们在谈论
null,就没有区别,因为这仅对实例有所不同。当重载了相等运算符时,这可能会改变。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)