一种更优雅的显示 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"(如评论中所述,如果需要,还可以简化重构)。
关于可空类型的显示格式,我有一个(可能)愚蠢的问题。目前,当我需要指出一个可空类型的字段确实有一个空值时,我会这样编码:
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"(如评论中所述,如果需要,还可以简化重构)。