空检查扩展方法

时间:2012-02-08 17:33:01

标签: c# linq resharper null-check

所以,我在应用程序中做了很多数据库工作 - 我的缓存系统有几种可能的返回值。它可以返回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))总是假的。

为什么?

3 个答案:

答案 0 :(得分:21)

由于您有“类”约束(where T: class),default(T) 始终等于null。您已经在原始if语句中检查了它,因此第二种情况(obj == default(T))永远不会成立。

答案 1 :(得分:1)

我不确定你是否因为你想要或因为你认为必须而将它限制在课堂上。如果是后者,这里有一种对复杂和简单类型进行默认值检查的方法:

public static bool Valid<T> (this T obj)
{
    return !EqualityComparer<T>.Default.Equals(obj, default(T));
}

如果您选择将其限制在课堂上只是故意或商业案例,请随意忽略此建议。另外一件事可能没有解释的是简单类型的装箱(虽然我现在通常使用可以为空的简单类型,这个代码确实适用)。

答案 2 :(得分:0)

您需要做出的第一个决定是: T 可以是 int 之类的值类型吗? 如果是这样,你可以删除

 where T: class

if (obj == null) return false;
else 

如果 T 始终是引用类型,则可以删除

if (obj == null) return false;