是的,這是有效的寫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/第二部分。這與模式匹配有關。 –