显示null的更优雅方式?

时间:2015-09-22 13:35:13

标签: c# nullable

我有一个关于可空类型的显示格式的(可能)愚蠢的问题。目前,当我需要指出可空类型的字段确实具有空值时,我将其编码为:

var stringToDisplay = nullableDecimal.HasValue ? nullableDecimal.ToString() : "N/A";

或该基本文字的一些变体。

我不认为我可以使用合并操作员 - 或者至少我不认为这是正确的方法(如果我错了,请纠正我)。

有更好,更有效的方法吗?我觉得这些样板代码现在越来越多地侵入我的代码库......

2 个答案:

答案 0 :(得分:11)

您的方法本身并不错,但您对代码重复的担心是正确的。您可以通过创建辅助方法来解决此问题,例如:

public static class DecimalExtensions
{
    public static string Display(this decimal? value) 
    {
        return value.HasValue ? value.ToString(): "N/A";
    }
}

在这个例子中,我创建了一个扩展方法,但常规方法也可以正常工作。然后你就可以做到:

var stringToDisplay = nullableDecimal.Display();

...更好阅读并防止代码中出现无数“N / A”(如评论中所述,如果需要,还可以简化重构)。

答案 1 :(得分:8)

在C#5或更早的版本中,你的代码可能和它一样好,但是如果你把它全部洒在那里,你总是可以将它提取出来。

还要考虑将"N/A"填充到常量中,以防您想要更改它。

然而,在C#6中你可以稍微改变它,虽然它不会更好地

var stringToDisplay = nullableDecimal?.ToString() ?? "N/A";

?.运算符被称为“空条件”运算符,基本上是您必须开始使用的表达式的简短语法。

基本上,表达式的那部分意味着:

string temp = nullableDecimal != null ? nullableDecimal.ToString() : null;

虽然?.运算符只会在它之前评估一次,而不是两次,所以它更像是这样:

var operand = nullableDecimal;
string temp = operand != null ? operand.ToString() : null;

虽然这里并不重要,但如果是方法调用,则可能是。

至于将其提取到方法中,只需创建一个扩展方法:

public static class MyNullableDecimalExtensions
{
    public static string ToDisplayText(this decimal? value)
    {
        if (decimal.HasValue)
            return decimal.Value.ToString();
        return "N/A";
    }
}

我并不过分喜欢?:运算符语法,所以在这样的方法中我会写出完整的if语句。

然后你可以这样称呼它:

var stringToDisplay = nullableDecimal.ToDisplayText();