是的,这是有效的写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是空相当于
Object.Equals(value, null);
所以,在大多数情况下o为空和o == null将表现相同的方式。除平等变体之外有点快。 但是!如果我们用以下类代替对象,情况将会发生巨大变化。
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的过载。但是○为空和○== null将给出不同的结果。所以要小心使用模式匹配是运算符。
https://blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/第二部分。这与模式匹配有关。 –