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);
}
已经过测试,可以用来对付数据对象,类和变量。 只是想知道是否有更好的方法来解决这个问题。
答案 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类型将仅通过指针传递。