C#字符串插值如何处理空值?

92
在C# 6.0中,添加了字符串插值。
string myString = $"Value is {someValue}";

在上面的示例中,如何处理空值?(如果someValue为null)

编辑:仅澄清一下,我已经测试并知道它没有失败,这个问题是为了确定是否有任何需要注意的情况,在使用字符串插值之前必须检查空值。


18
运行并查看? - James Thorpe
5
@Jamesthorpe,谢谢,我已经运行过了。似乎我没有很好地表达出来的一点是使用它是否存在缺点。我可以看出这个问题如果重新表述会更有益…… - Calle
我认为你的“不同问题”是不相关的,因为它太广泛了。 - svick
2
也许这很显然,但如果您有 $"Value is {someObject.someValue}",而 someObject 为 null,则会引发 NRE,因此您应该使用空值条件运算符: {someObject?.someValue}。这是需要注意的一个情况。 - Nick Westgate
3个回答

67

这就和string.Format("Value is {0}", someValue)一样,它会检查是否为null引用并替换为空字符串。但是,如果你像这样传递nullstring.Format("Value is {0}", null),它将抛出异常。然而,在$"Value is {null}"的情况下,那个null首先被设置为一个参数,不会抛出异常。


1
抱歉,这只适用于对象,当您传递一个空字符串时,它不会抛出异常。 - Selman Genç
@SelmanGenç 对于任何可空类型,它都不会抛出异常。文档似乎是错误的。 - juharr
9
如果它将你视为将null作为args参数传递本身而不是空元素,则会抛出异常。 - James Thorpe
啊,我实际上正在执行 Console.WriteLine("{0}", null);,它会忽略 null。我以为它只是将所有内容传递给 string.Format - juharr
啊,好的,那就说得通。 - James Thorpe
3
值得一提的是,Console.WriteLine 方法的实现代码在这里,其中空参数被包装在 ParamsArray 中,而直接调用的情况下则在这里进行了空引用检查,然后继续使用不同的 ParamsArray 构造函数。 - James Thorpe

29

TryRoslyn反编译的结果是:

string arg = null;
string.Format("Value is {0}", arg);

String.Format 会针对 null 值使用空字符串。请参见简介中的格式方法部分:

如果参数的值为 null,则该格式项将被替换为 String.Empty


2
似乎已经发生了变化。现在反编译为:string str = null; string text = "Value is " + str; 空字符串仍然被替换为String.Empty。 - cfwall
1
@cfwall 是的,但这并不太重要,因为对于 + 运算符,C# 编译器会在内部将其转换为 String.Concat 静态方法,并且在处理 null 值时仍然表现得像 string.Empty - Soner Gönül

2

看起来行为取决于调用哪些底层格式化方法,而且这些实现可能会随时间而改变。如果您将null格式化为字符串,例如“(null)”,则不确定在未来几年内是否仍然保持不变。在某些新版本的.NET中,它可能开始抛出异常。

因此,我认为最安全的方法是制定一些条件以避免使用null。编写一个简单的三元运算符,如:

int? someValue = 5;
var valueStr = (someValue is not null) ? someValue.ToString() : string.Empty;
var myString = $"Value is {valueStr}";

这是一行额外的代码,但至少行为是可控的。


1
我投了一票,尽管它可能不是对问题的直接回答,但它很有道理。 - Calle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接