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

3 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);
}
Run Code Online (Sandbox Code Playgroud)

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

Ran*_*pho 8

看起来你正在尝试复制null coalesce运算符:

var foo = myPossiblyNullValue ?? defaultValue;
Run Code Online (Sandbox Code Playgroud)


Kon*_*lph 5

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

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

第三,你的条件是奇怪的:

Object.Equals(value,null)) | (Object.Equals(value,DBNull.Value)
Run Code Online (Sandbox Code Playgroud)

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

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