Null检查扩展方法
本文关键字:方法 扩展 检查 Null | 更新日期: 2023-09-27 18:24:00
所以,我在一个应用程序中做了很多数据库工作,我的缓存系统有几个可能的返回值。它可以返回null,可以返回默认值(类型),也可以返回无效对象(所谓无效对象,我指的是属性/值不正确的对象)。我想创建一个扩展方法来为我进行所有这些检查,比如:
public static bool Valid<T> (this T obj) where T: class
{
if (obj == null)
return false;
else if (obj == default(T))
return false;
//Other class checks here
else
return true;
}
问题是,我的编译器告诉我if (obj == default(T))
永远是假的。
为什么?
由于有一个"类"约束(where T: class
),default(T)
总是等于null。您已经在原始if语句中对此进行了检查,因此第二种情况(obj == default(T)
)永远不可能为真。
我不确定你是因为想要还是因为觉得必须将其约束到类中。如果是后者,这里有一种方法可以对复杂和简单类型进行默认值检查:
public static bool Valid<T> (this T obj)
{
return !EqualityComparer<T>.Default.Equals(obj, default(T));
}
如果您选择仅将其限制为类是有意的,或者是出于商业案例,请忽略此建议。这可能没有考虑到的另一件事是简单类型的装箱(尽管我现在通常使用可为null的简单类型,这段代码确实适用于此)。
您需要做出的第一个决定是:T是否可以是类似int的值类型
如果是,您可以删除
where T: class
和
if (obj == null) return false;
else
如果T始终是参考类型,则可以删除
if (obj == null) return false;