检查对象上的空引用的最有效方法是什么?我看过各种代码示例,它们有不同的检查方式,以便最有效或者被认为是最佳实践使用的方法如下:
Object.ReferenceEquals(item, null)
item == null
item != null
Object.Equals(item, null)
Run Code Online (Sandbox Code Playgroud)
谢谢
Object.ReferenceEquals(item, null)比较参考和等于item == null.Object.Equals(item, null)比较引用类型的引用和值类型的按位,但在反射器中它等于(item == null) || ((item != null && null != null) && item.Equals(null)).item != null代码并不总是等于!(item == null),但结果当然应该是相等的.item == null代码不等于null == item,它类似于typeof(item).Equals(object)和object.Equals(typeof(item))方法调用.它不同,因为你可以重写!=,==,Equals.使用已知实现的方法,null == item最好是编码,但更难阅读.
Object.ReferenceEquals(null, item)可能更快或更快.
PS也使用string.IsNullOrEmpty(item)
为了比较null,我会使用==或!=经常,因为null它要经常给相同的结果ReferenceEquals,并Equals无论如何(所以不需要额外的代码).
编辑:确实==可以覆盖以给出错误的结果null(即true),但这意味着覆盖是错误的.为了使代码可读,我会坚持==和!=.
从 C# 7.0 开始,您可以使用:
item is null
Run Code Online (Sandbox Code Playgroud)
应该是最简单、最万无一失的方式。和ReferenceEquals支票一样。
1)
Object.ReferenceEquals(item, null)
Run Code Online (Sandbox Code Playgroud)
这是一个好方法。不像我想要的那么简洁,但仍然很棒并且准确地告诉你意图。
2)
item == null
item != null
Run Code Online (Sandbox Code Playgroud)
如果您确定并随后正确重载,这没有错(这是最优雅的)。它很容易编写(重载)错误的相等运算符(并且经常这样做)。但真正的麻烦是当你试图在类中重载运算符时(比如值语义)。您不能在类的重载函数内使用空检查,因为这会导致无限递归。为了拥有一种一致的风格,我依赖于其他东西。==!=======
3)
Object.Equals(item, null)
Run Code Online (Sandbox Code Playgroud)
同样,它在内部执行 aReferenceEquals所以没有多大意义,但如果它在语义上对您更有意义,那么就使用它。
4)
我的做法是
(object)item == null
Run Code Online (Sandbox Code Playgroud)
我依赖于object它自己的相等运算符,它不会出错。不太可读,所以我只包含一个自定义扩展方法和一个重载:
public static bool IsNull<T>(this T obj) where T : class
{
return (object)obj == null;
}
public static bool IsNull<T>(this T? obj) where T : struct
{
return !obj.HasValue;
}
Run Code Online (Sandbox Code Playgroud)
这更有意义,因为我需要DBNull经常检查s。所以现在我有一个一致的风格!
public static bool IsNull<T>(this T obj) where T : class
{
return (object)obj == null || obj == DBNull.Value;
}
Run Code Online (Sandbox Code Playgroud)
(不要取消(object)强制转换,因为这会==在如前所述的重载时防止无限递归)
此外,约束阻止IsNull了值类型。现在就像打电话一样甜蜜
object obj = new object();
Guid? guid = null;
bool b = obj.IsNull(); // false
b = guid.IsNull(); // true
2.IsNull(); // error
Run Code Online (Sandbox Code Playgroud)
我还发现(object)item == null它比Object.ReferenceEquals(item, null)或object.Equals(,)就此而言非常非常非常快,但前提是它很重要(我目前正在研究一些我必须对所有内容进行微优化的东西!)。
要查看有关实施相等性检查的完整指南,请参阅什么是比较引用类型的两个实例的“最佳实践”?
| 归档时间: |
|
| 查看次数: |
22629 次 |
| 最近记录: |