我有一个关于可空类型的显示格式的(可能)愚蠢的问题。目前,当我需要指出可空类型的字段确实具有空值时,我将其编码为:
var stringToDisplay = nullableDecimal.HasValue ? nullableDecimal.ToString() : "N/A";
或该基本文字的一些变体。
我不认为我可以使用合并操作员 - 或者至少我不认为这是正确的方法(如果我错了,请纠正我)。
有更好,更有效的方法吗?我觉得这些样板代码现在越来越多地侵入我的代码库......
答案 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();