gpt4 book ai didi

c# - 使用 "is"关键字和 "null"关键字 c# 7.0

转载 作者:太空狗 更新时间:2023-10-29 18:03:52 25 4
gpt4 key购买 nike

最近我发现,以下代码在 VS2017 中按预期编译和工作。但是我找不到关于此的任何主题/文档。所以我很好奇使用这种语法是否合法:

class Program
{
static void Main(string[] args)
{
var o = new object();
Console.WriteLine(o is null);
o = null;
Console.WriteLine(o is null);
Console.ReadLine();
}
}

顺便说一句,这在 VS2015 中不起作用

最佳答案

是的,写o is null是有效的,但这不等同于o == null .代码

static bool TestEquality(object value) => value == null;

编译成以下 IL 指令。

  IL_0000:  ldarg.0
IL_0001: ldnull
IL_0002: ceq
IL_0004: ret

按以下方式编译的模式匹配案例:

static bool TestPatternMatching(object value) => value is null;

IL_0000: ldnull
IL_0001: ldarg.0
IL_0002: call bool [System.Runtime]System.Object::Equals(object, object)
IL_0007: ret

因此,模式匹配 o is null 等同于

Object.Equals(value, null);

因此,在大多数情况下,o 为 null 并且 o == null 的行为方式相同。除了平等变体有点快。 但是!如果我们将 object 替换为以下类,情况将会发生巨大变化。

class TestObject
{
public static bool operator ==(TestObject lhs, TestObject rhs) => false;
public static bool operator !=(TestObject lhs, TestObject rhs) => false;
}

和方法

static bool TestEquality(TestObject value) => value == null;
static bool TestPatternMatching(TestObject value) => value is null;

模式匹配将保持不变,但相等变体将使用以下 IL

  IL_0000:  ldarg.0
IL_0001: ldnull
IL_0002: call bool PatternMatchingTest.TestObject::op_Equality(class PatternMatchingTest.TestObject, class PatternMatchingTest.TestObject)
IL_0007: ret

在这里我们可以看到,== 运算符按预期使用了 TestObject 的重载。但是 o is nullo==null 会给出不同的结果。所以要小心使用模式匹配 is 运算符。

关于c# - 使用 "is"关键字和 "null"关键字 c# 7.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43295160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com