C# 使用空合并运算符的字符串连接

C# 使用空合并运算符的字符串连接,c#,string-concatenation,C#,String Concatenation,我试图构建一个如下所示的字符串,我注意到它在使用??运算符,无论上一个值是否为null "Some Text" + System.Environment.NewLine + varOne.ToString() ?? string.Empty + System.Environment.NewLine + varTwo.ToString()... 字符串包含的所有内容,无论值是多少,都取决于varOne Some Text+newline+varOne,除非我删除??操作人员环顾四周后,我发现这不

我试图构建一个如下所示的字符串,我注意到它在使用??运算符,无论上一个值是否为null

"Some Text" + System.Environment.NewLine +
varOne.ToString() ?? string.Empty + System.Environment.NewLine +
varTwo.ToString()...
字符串包含的所有内容,无论值是多少,都取决于varOne Some Text+newline+varOne,除非我删除??操作人员环顾四周后,我发现这不是最好的方法,我可能应该使用stringbuilder,但我只是好奇为什么会发生这种情况?

试试:

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

看看

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

这意味着,之后的东西??仅当前面的填充为空时才分配

所以

那就是塔达

sNormal也会是TADA

看看

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

这意味着,之后的东西??仅当前面的填充为空时才分配

所以

那就是塔达


sNormal也应该是TADA

varOne。ToString从不为null。假设我们有一个??b+c+d??n、 如果是整件事发展到a,而不是a+d??n因为运算符优先级

varOne.ToString从不为空。假设我们有一个??b+c+d??n、 如果是整件事发展到a,而不是a+d??n因为运算符的优先级

??运算符表示如果此运算符前面的对象不为null,则使用它,否则使用此运算符后面的对象

你可能会感到困惑的是,这个操作符前面的东西是由什么构成的。就你而言,这就是全部:

"Some Text" + System.Environment.NewLine + varOne.ToString()
这永远不会是空的。即使varOne.ToString返回null,这在varOne的类中也是一个bug,因为ToString永远不应该返回null,所以将字符串与null连接起来的结果就是原始字符串。绝对不存在上述情况会导致null的情况

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

"Some Text" + System.Environment.NewLine +
(varOne != null ? varOne.ToString() : string.Empty) + System.Environment.NewLine +
varTwo.ToString()...
这将检查varOne是否不为null,如果不为null,则使用varOne.ToString,如果为null,则返回到string.Empty


请注意,与使用StringBuilder相比,我避免了这种编码风格的整个问题,因为这实际上不是问题的一部分??运算符表示如果此运算符前面的对象不为null,则使用它,否则使用此运算符后面的对象

你可能会感到困惑的是,这个操作符前面的东西是由什么构成的。就你而言,这就是全部:

"Some Text" + System.Environment.NewLine + varOne.ToString()
这永远不会是空的。即使varOne.ToString返回null,这在varOne的类中也是一个bug,因为ToString永远不应该返回null,所以将字符串与null连接起来的结果就是原始字符串。绝对不存在上述情况会导致null的情况

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

"Some Text" + System.Environment.NewLine +
(varOne != null ? varOne.ToString() : string.Empty) + System.Environment.NewLine +
varTwo.ToString()...
这将检查varOne是否不为null,如果不为null,则使用varOne.ToString,如果为null,则返回到string.Empty


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

现在答案已经改变了。你可以:

"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}"

现在答案已经改变了。你可以:

"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}"

如果一个变量为null,那么对它调用ToString将抛出。框架中没有从ToString返回null的类,我怀疑这样做是否是个好主意。所以ToString之后的null合并操作符没有意义。可能是:varOne==null?string.Empty+System.Environment.NewLine:varOne.ToStringPerhaps一些附加括号可能会有所帮助??优先级低于+。看看这个:@TimSchmelter很好的解释,谢谢。如果一个变量为null,调用它的ToString将抛出。框架中没有类从ToString返回null,我怀疑这样做是不是一个好主意。所以ToString之后的null合并操作符没有意义。可能是:varOne==null?string.Empty+System.Environment.NewLine:varOne.ToStringPerhaps一些附加括号可能会有所帮助??优先级低于+。看看这个:@TimSchmelter很好的解释,谢谢。@X.L.Ant很好的解决方案谢谢。只有
我之所以没有将其标记为答案,是因为我想了解它为什么不起作用,而不仅仅是修复它的代码:@X.L.Ant很好的解决方案,谢谢。我没有将其标记为答案的唯一原因是我想了解它为什么不起作用,而不仅仅是编写代码来修复它: