随着 C# 9.0 的发布,引入了否定的空常量模式。
模式匹配状态的文档:
从 C# 9.0 开始,可以使用否定的 null 常量模式来检查非 null,如以下示例所示:
if (e is not null) { // ... }
除了语法之外,e is not null
和e != null
之间有什么区别吗?
e != null
和e is not null
之间的主要区别在于编译器执行比较的方式。
Microsoft:">编译器保证在计算表达式 x为 null 时不会调用用户重载的相等运算符 ==。
底线:如果您编写的代码不想依赖于某人对!=
和==
运算符的实现,请使用is null
和is not null
,因为它更安全。
请参阅以下示例:
public class TestObject
{
public string Test { get; set; }
// attempt to allow TestObject to be testable against a string
public static bool operator ==(TestObject a, object b)
{
if(b == null)
return false;
if(b is string)
return a.Test == (string)b;
if(b is TestObject)
return a.Test == ((TestObject)b).Test;
return false;
}
public static bool operator !=(TestObject a, object b)
{
if(b == null)
return false;
if(b is string)
return a.Test != (string)b;
if(b is TestObject)
return a.Test != ((TestObject)b).Test;
return false;
}
}
如果你的代码需要确保对象不为 null,使用is not null
会给你带来比使用!= null
更好的TestObject
结果,因为==
/!=
运算符的重载有点奇怪。
控制台示例 1:
TestObject e = null;
if(e == null)
Console.WriteLine("e == null");
if(e is null)
Console.WriteLine("e is null");
输出:e is null
控制台示例 2:
TestObject e = new TestObject();
if(e != null)
Console.WriteLine("e != null");
if(e is not null)
Console.WriteLine("e is not null");
输出:e is not null
两个重载运算符都没有"正确"实现,因此控制台永远不会输出e == null
或e != null
。
唯一的区别(除了语法)是,编译器保证在使用is not null
而不是!= null
(或is null
而不是== null
)时不调用用户重载运算符。
从操作员重载:
用户定义类型可以重载预定义的 C# 运算符。也就是说,一个 类型可以提供操作的自定义实现,以防万一 或者两个操作数都属于该类型。可重载运算符 部分显示哪些 C# 运算符可以重载。