【问题标题】:How are null values in C# string interpolation handled?如何处理 C# 字符串插值中的空值?
【发布时间】:2016-06-24 01:03:03
【问题描述】:

在 C# 6.0 中,添加了字符串插值。

string myString = $"Value is {someValue}";

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

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

【问题讨论】:

  • 运行一下看看?
  • @Jamesthorpe,谢谢,我已经运行它了。似乎我没有得到太多理解的一点是,使用它是否有缺点。我可以看到这个问题会因改写而受益......
  • 我认为你的“不同的问题”是题外话,因为它太宽泛了。
  • 也许这很明显,但是如果你有 $"Value is {someObject.someValue}" 并且 someObject 是 null 那么它会抛出一个 NRE,所以你应该使用 null 条件运算符:{someObject ?.someValue}。这是一个需要注意的案例。

标签: c# c#-6.0


【解决方案1】:

这与string.Format("Value is {0}", someValue) 相同,它将检查null 引用并将其替换为空字符串。但是,如果您像 string.Format("Value is {0}", null) 这样实际传递 null,它将引发异常。但是在$"Value is {null}" 的情况下,null 首先被设置为一个参数并且不会抛出。

【讨论】:

  • 对不起,它只适用于对象,当你传递一个空字符串时它不会抛出
  • @SelmanGenç 它不会抛出任何可为空的类型。文档似乎是错误的。
  • 如果它认为你拥有passed null for the args parameter 本身,而不是一个空元素,它就会抛出
  • 啊,我实际上在做Console.WriteLine("{0}", null);,它确实忽略了null。我假设它只是将所有内容传递给string.Format。
  • FWIW,Console.WriteLineends up here,其中 null arg 包含在 ParamsArray 中,而直接调用 ends up here 在遇到不同的构造函数之前会执行 null ref 检查ParamsArray.
【解决方案2】:

来自TryRoslyn,反编译为;

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

和String.Format 将使用空字符串作为null 值。在The Format method in brief部分;

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

【讨论】:

  • 这似乎已经改变了。现在反编译为: string str = null; string text = "值为" + str;空字符串仍然替换为 String.Empty。
  • @cfwall 是的,但这并不重要,因为对于 + 运算符,C# 编译器在内部将其转换为 String.Concat 静态方法,它 still 的行为类似于string.Empty 处理 null 值时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
相关资源
最近更新 更多