"is not null"和"!= null"有什么区别?

  • 本文关键字:null 区别 is not c# c#-9.0
  • 更新时间 :
  • 英文 :


随着 C# 9.0 的发布,引入了否定的空常量模式。

模式匹配状态的文档:

从 C# 9.0 开始,可以使用否定的 null 常量模式来检查非 null,如以下示例所示:

if (e is not null)
{
// ...
}

除了语法之外,e is not nulle != null之间有什么区别吗?

e != nulle is not null之间的主要区别在于编译器执行比较的方式。

Microsoft:">编译器保证在计算表达式 x为 null 时不会调用用户重载的相等运算符 ==。

底线:如果您编写的代码不想依赖于某人对!===运算符的实现,请使用is nullis 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 == nulle != null

唯一的区别(除了语法)是,编译器保证在使用is not null而不是!= null(或is null而不是== null)时不调用用户重载运算符。

从操作员重载:

用户定义类型可以重载预定义的 C# 运算符。也就是说,一个 类型可以提供操作的自定义实现,以防万一 或者两个操作数都属于该类型。可重载运算符 部分显示哪些 C# 运算符可以重载。

最新更新