C# 中的空引用比较:“x is null”与“x == null”
在 C# 7 中,引入与传统的 == null 表达式相比,模式匹配运算符 is 引发了对其用法的疑问。虽然这些表达式在处理 null 时似乎可以互换,但在比较引用类型时需要考虑一些关键差异。
类型注意事项
与比较对象的 == null 不同引用相等,x is null 检查 x 的类型。如果 x 是引用类型,则仅当 x 为 null 时,x is null 才返回 true。相反,对于 null 和具有非 null 值的引用类型,x == null 都会返回 true。
class Foo {} Foo foo = null; Console.WriteLine(foo is null); // True Console.WriteLine(foo == null); // True
性能影响
内部,x 是 null 调用System.Object.Equals(object, object),而 x == null 调用 ceq(引用类型的比较方法)。对于空引用,两个表达式具有相同的性能,因为它们都返回 true。然而,对于非空引用,由于额外的类型检查,x is null 可能会显着变慢。
重载的等式运算符
当等式运算符(例如== 或 Equals) 对于特定类型被重载,x is null 不再检查类型相等性,而是委托给重载的运算符。另一方面,x == null 始终检查引用是否相等。
class Foo { public static bool operator ==(Foo left, Foo right) => ... public static bool operator !=(Foo left, Foo right) => ... } Foo foo1 = new Foo(); Foo foo2 = null; Console.WriteLine(foo1 is null); // False (checks type only) Console.WriteLine(foo1 == null); // False (delegates to overloaded operator) Console.WriteLine(foo2 is null); // True (checks type only) Console.WriteLine(foo2 == null); // True (reference comparison)
何时使用一个而不是另一个
一般来说:
最终,x is null 和 x = 之间的选择= null 取决于您代码的具体要求。
以上是C# Null 检查:何时使用'x is null”与'x == null”?的详细内容。更多信息请关注PHP中文网其他相关文章!