可空类型:在c#中检查null或0的最佳方法

nai*_*own 74 c# null zero

我正在开展一个项目,我发现我正在许多地方检查以下内容:

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)){} //但你从中得不到多少

  • @nailitdown:不是,你只需要一个Nullable <T>的扩展方法.双?是Nullable <double>的别名.您的签名将如下所示:public static bool IsNullOrValue <T>(此Nullable <T>,t valueToCheck)其中T:struct (11认同)
  • 谢谢 - 非常简洁!我关注可读性,但得出的结论是,如果我真的理解了它,那将是完全可读的.运营商. (3认同)
  • @nailitdown :(第二部分)你的return语句看起来像return(value ?? default(T)).Equals(valueToCheck); (3认同)
  • 美丽的东西。 (2认同)
  • 你应该使用扩展方法; 虽然它在写作的那一刻是可读的,但是这个小代码块需要一小部分思考,这意味着如果你试图阅读代码并使用它 - 你会分散你的主要问题. (2认同)
  • 如果将其缩短为“ IsNullOr(0)”,它自然会读为“是null还是零” (2认同)

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'等等...

  • 扩展方法: `public static bool IsNullOrValue&lt;T&gt;(this T? value, T valueToCheck) where T : struct { return (value ?? default(T)).Equals(valueToCheck); }` (2认同)

Eri*_*sot 32

C#9:你可以写

if (item.Rate is null or 0)
Run Code Online (Sandbox Code Playgroud)


Hei*_*nzi 29

虽然我非常喜欢接受的答案,但我认为,为了完整起见,还应该提到这个选项:

if (item.Rate.GetValueOrDefault() == 0) { }
Run Code Online (Sandbox Code Playgroud)

这个解决方案


¹但这不应影响您的决定,因为这些微观优化不太可能产生任何影响.


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)