这是使用泛型检查空值的最佳方法吗?

时间:2010-03-16 13:08:25

标签: c# generics

public static T IsNull<T>(object value, T defaultValue)
{
    return ((Object.Equals(value,null)) | (Object.Equals(value,DBNull.Value)) ?
        defaultValue : (T)value);
}

public static T IsNull<T>(object value) where T :new()
{
    T defaultvalue = new T();
    return IsNull(value, defaultvalue);
}

已经过测试,可以用来对付数据对象,类和变量。 只是想知道是否有更好的方法来解决这个问题。

4 个答案:

答案 0 :(得分:8)

您似乎正在尝试复制null coalesce operator

var foo = myPossiblyNullValue ?? defaultValue;

答案 1 :(得分:5)

首先关闭,方法名称​​错误。你暗示函数的结果是一个布尔值,如果给定的值为null,则为true。事实上,情况并非如此。 GetValueOrDefault可能是一个更好的名字。

其次,你只是在复制其他人提到的null coalesce运算符的行为。

第三,您的条件是奇数:

Object.Equals(value,null)) | (Object.Equals(value,DBNull.Value)

为什么Object.Equals代替==?更好的是,使用Object.ReferenceEquals,因为这清楚表明您对引用相等感兴趣。此外,您正在使用在此上下文中语义错误的按位或运算符(|),尽管它恰好产生了正确的值。你想要布尔运算符||。 (另外,不一致:为什么有时候会写object,有时会写Object?)

最后,使用类型object而不是通用类型不一定是一个好的解决方案。为通用引用和值类型创建重载会更好:这可以避免在值类型中装箱。这也意味着您不必在第二个重载中明确指定类型,因为它可以从方法参数中推断出来。

答案 2 :(得分:2)

public static bool IsNull<T>(object value)
{
    return object == default(T);
}

答案 3 :(得分:1)

[被修改]

以下(非通用)应该有效。

    public static bool IsNull(object value) 
    {
        return value == null;
    } 

任何值类型都将被装箱(即非空)。 Ref类型将仅通过指针传递。