您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

“ x为空”和“ x ==空”有什么区别?

“ x为空”和“ x ==空”有什么区别?

Roslyn编译器已更新,以在 没有重载的相等运算符时 使两个运算符的行为相同。请查看当前编译器结果M1M2代码)中的代码,该代码显示了没有重载的相等比较器时发生的情况。他们俩现在都表现得更好==。如果存在相等的比较器超载,则代码仍然不同

有关较旧版本的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评论is null呼吁System.Object::Equals(object, object)地方==调用ceq

ILis

IL_0000: ldarg.1              // Load argument 1 onto the stack
IL_0001: ldnull               // Push a null reference on the stack
IL_0002: call bool [mscorlib]System.Object::Equals(object, object) // Call method indicated on the stack with arguments
IL_0007: ret                  // Return from method, possibly with a value

IL==

IL_0000: ldarg.1              // Load argument 1 onto the stack
IL_0001: ldnull               // Push a null reference on the stack
IL_0002: ceq                  // Push 1 (of type int32) if value1 equals value2, else push 0
IL_0004: ret                  // Return from method, possibly with a value

既然我们在谈论null,就没有区别,因为这仅对实例有所不同。当重载了相等运算符时,这可能会改变。

其他 2022/1/1 18:13:56 有596人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶