C# 显示null的更优雅的方式?

C# 显示null的更优雅的方式?,c#,nullable,C#,Nullable,关于可空类型的显示格式,我有一个(可能)愚蠢的问题。目前,当我需要指出一个可为null类型的字段确实有一个null值时,我的代码如下: var stringToDisplay = nullableDecimal.HasValue ? nullableDecimal.ToString() : "N/A"; var operand = nullableDecimal; string temp = operand != null ? operand.ToString() : null; var s

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

var stringToDisplay = nullableDecimal.HasValue ? nullableDecimal.ToString() : "N/A";
var operand = nullableDecimal;
string temp = operand != null ? operand.ToString() : null;
var stringToDisplay = nullableDecimal.ToDisplayText();
或者基本文本的一些变体

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

有没有更好更有效的方法?我只是觉得这些天来,这个样板代码越来越多地侵扰着我的代码库……

在C#5或更旧的版本中,您的代码可能已经达到了它所能达到的水平,尽管如果您将其散布到各个地方,您可以将其提取到自己的方法中

还考虑将填充<代码>“N/A”< /C> >为常量,以备更改。

但是,在C#6中,您可以对其进行一些更改,尽管不会变得更好:

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

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

string temp = nullableDecimal != null ? nullableDecimal.ToString() : null;
虽然
?。
操作员只会对零件之前的零件进行一次评估,而不是两次,所以它更像这样:

var stringToDisplay = nullableDecimal.HasValue ? nullableDecimal.ToString() : "N/A";
var operand = nullableDecimal;
string temp = operand != null ? operand.ToString() : null;
var stringToDisplay = nullableDecimal.ToDisplayText();
虽然在这里不是很重要,但如果它是一个方法调用,它可能是

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

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.HasValue ? nullableDecimal.ToString() : "N/A";
var operand = nullableDecimal;
string temp = operand != null ? operand.ToString() : null;
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”(如注释中所述,如果需要,也可以简化重构)。

为什么不使用通用扩展方法?我只是键入了一些几乎完全相同的内容,另一方面,它给了您一个地方,您必须更改“N/A”如果你需要重构字符串来表示其他内容,比如“无”。拼写错误:DecimalExtensions应该是DecimalExtensions。如果我能接受你和Konamiman的答案,我会的!谢谢你们两位的指导——我很高兴地使用了两个答案的一部分。