我正在开展一个项目,我发现我正在许多地方检查以下内容:
if(item.Rate == 0 || item.Rate == null) { }
Run Code Online (Sandbox Code Playgroud)
更像是一种奇怪而不是什么,检查这两种情况的最佳方法是什么?
我添加了一个辅助方法,它是:
public static bool nz(object obj)
{
var parsedInt = 0;
var parsed = int.TryParse(obj.ToString(), out parsedInt);
return IsNull(obj) || (parsed && parsedInt == 0);
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
egl*_*ius 144
我喜欢 if ((item.Rate ?? 0) == 0) { }
更新1:
您还可以定义一个扩展方法,如:
public static bool IsNullOrValue(this double? value, double valueToCheck)
{
return (value??valueToCheck) == valueToCheck;
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
if(item.IsNullOrValue(0)){}
//但你从中得不到多少
CMS*_*CMS 41
使用泛型:
static bool IsNullOrDefault<T>(T value)
{
return object.Equals(value, default(T));
}
//...
double d = 0;
IsNullOrDefault(d); // true
MyClass c = null;
IsNullOrDefault(c); // true
Run Code Online (Sandbox Code Playgroud)
如果T
它是引用类型,value
则将与null
(default(T)
)进行比较,否则,如果T
是a value type
,则说是double,default(t)
是0d,对于bool是false
,对于char是'\0'
等等...
Hei*_*nzi 29
虽然我非常喜欢接受的答案,但我认为,为了完整起见,还应该提到这个选项:
if (item.Rate.GetValueOrDefault() == 0) { }
Run Code Online (Sandbox Code Playgroud)
这个解决方案
((item.Rate ?? 0) == 0)
(这可能是一个品味问题).¹但这不应影响您的决定,因为这些微观优化不太可能产生任何影响.
Jos*_*non 19
这只是弗雷迪里奥斯仅使用泛型的接受答案的扩展.
public static bool IsNullOrDefault<T>(this Nullable<T> value) where T : struct
{
return default(T).Equals( value.GetValueOrDefault() );
}
public static bool IsValue<T>(this Nullable<T> value, T valueToCheck) where T : struct
{
return valueToCheck.Equals((value ?? valueToCheck));
}
Run Code Online (Sandbox Code Playgroud)
注意我们不需要检查null(T)是否为null,因为我们正在处理值类型或结构!这也意味着我们可以安全地假设T valueToCheck不会为null; 记得这里T?是简写为Nullable <T>所以通过将扩展添加到Nullable <T>,我们得到int?,double?,bool中的方法?等等
例子:
double? x = null;
x.IsNullOrDefault(); //true
int? y = 3;
y.IsNullOrDefault(); //false
bool? z = false;
z.IsNullOrDefault(); //true
Run Code Online (Sandbox Code Playgroud)