1

我试图构建一个如下所示的字符串,但我注意到它在使用 ?? 后被切断了。运算符,无论前一个值是否为空。

"Some Text" + System.Environment.NewLine +
varOne.ToString() ?? string.Empty + System.Environment.NewLine +
varTwo.ToString()...

除非我删除 ?? 操作员。环顾四周后,我发现这不是首选的方法,我可能应该使用 stringbuilder 代替,但我只是好奇为什么会发生这种情况?

4

5 回答 5

7

看看??运算符(C# 参考)

这 ??运算符称为空值合并运算符,用于为可空值类型或引用类型定义默认值。如果操作数不为空,则返回左侧操作数;否则返回正确的操作数。

这意味着,??只有在它之前的东西为空时才分配后面的东西。

所以

        string sNull = null;
        string s = sNull ?? "TADA";

s将会TADA

        string sNull = null;
        string s = sNull ?? "TADA";
        string sNormal = s ?? "NOT TADA";

sNormal也会是TADA

于 2013-06-19T12:52:22.547 回答
2

尝试 :

"Some Text" + System.Environment.NewLine +
(varOne == null ? string.Empty : varOne.ToString()) + System.Environment.NewLine +
varTwo.ToString()...
于 2013-06-19T12:51:00.757 回答
1

varOne.ToString()从来没有null。假设我们有a ?? b + c + d ?? n,如果a != null整个事情演变为a而不是a + (d ?? n)(因为运算符优先级)

于 2013-06-19T12:53:23.353 回答
1

这 ??运算符的意思是“如果此运算符之前的事物不为空,则使用它,否则使用此运算符之后的事物”。

您可能会感到困惑的是什么构成了“此运算符之前的事物”。在你的情况下,这就是全部:

"Some Text" + System.Environment.NewLine + varOne.ToString()

那永远不会为空。即使 varOne.ToString() 返回 null(这将是 varOne 类中的一个错误,因为 ToString() 永远不应返回 null),将字符串与 null 连接的结果是原始字符串。绝对没有上述情况可能导致 null 的情况。

现在,varOne可能为空,在这种情况下你会得到一个异常。这可能是你认为你要防范的,但事实并非如此。如果这真的是你想要的,你需要这样的东西:

"Some Text" + System.Environment.NewLine +
(varOne != null ? varOne.ToString() : string.Empty) + System.Environment.NewLine +
varTwo.ToString()...

这会检查 varOne 是否为空,如果不是则使用 varOne.ToString,如果是则回退到 string.Empty。

请注意,我已经避免了这种编码风格与使用 StringBuilder 的整个问题,因为这实际上不是问题的一部分。

于 2013-06-19T13:18:21.763 回答
0

如今,答案已经改变。你可以:

"Some Text" + System.Environment.NewLine +
// no need to coalesce because concatenating nulls are ignored
varOne?.ToString() 
System.Environment.NewLine + varTwo.ToString()

甚至

$"Some Text{System.Environment.NewLine}{varOne}{System.Environment.NewLine}{varTwo}"
// If you're not writing to a system-dependent file, \r\n will also work fine:
$"Some Text\r\n{varOne}\r\n{varTwo}"
于 2017-06-21T12:12:54.677 回答