一种更优雅的显示 null 的方式?

A more elegant way to display null?

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

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

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

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

有没有更好更有效的方法呢?我只是觉得这些样板代码越来越多地侵扰我的代码库...

在 C# 5 或更早的版本中,您的代码可能已达到最佳状态,但如果您将其散布到各处,您始终可以将其提取到自己的方法中。

还可以考虑将 "N/A" 填充到常量中,以备不时之需。

但是,在 C# 6 中,您可以稍微更改它,尽管它不会很多更好:

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

?. 运算符称为 "null-conditional" 运算符,基本上是您必须开始的表达式的简短语法。

基本上,这部分表达式的意思是:

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();

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

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

在此示例中,我创建了一个扩展方法,但常规方法也可以正常工作。那么你可以这样做:

var stringToDisplay = nullableDecimal.Display();

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