0

我有以下内容:

string Name = name.First + " "  +  name.Last;

这返回Tom Jones就好了。

如果 name.First 可能为 null 或 name.Last 可能为 null,我有以下内容:

string SpeakerName = name.First ?? string.Empty + " "  +  name.Last ?? string.Empty;

奇怪的是它只返回Tom。为什么会这样,我该如何修复它,if null使其默认为空字符串的名字或姓氏?

4

4 回答 4

12

因为 ?? 的相对优先级 和 + 运算符。尝试这个:

string SpeakerName = (name.First ?? "") + " " + (name.Last ?? "");

您的原始示例正在评估,就好像它是:

string SpeakerName = name.First ?? ("" + " "  +  (name.Last ?? ""));

另外,请在此处阅读 Jon 的回答:C# null-coalescing (??) 运算符的运算符优先级是什么?

正如他在那里建议的那样,这也应该有效:

string SpeakerName = name.First + " " + name.Last;

因为这编译为@LB下面的答案,减去修剪:

string SpeakerName = String.Format("{0} {1}", name.First, name.Last)

编辑:

您还要求 first 和 last 都 == null 使结果为空字符串。通常,这可以通过调用.Trim()结果来解决,但这并不完全等效。例如,如果名称不为空,您可能出于某种原因需要前导或尾随空格,例如“Fred”+“Astair”=>“Fred Astair”。我们都认为你会想要修剪这些。如果你不这样做,那么我建议使用条件:

string SpeakerName = name.First + " " + name.Last;
SpeakerName = SpeakerName == " " ? String.Empty : SpeakerName;

如果您从不想要前导或尾随空格,只需.Trim()像 @LB 一样添加

于 2012-07-24T18:40:12.203 回答
6
string SpeakerName = String.Format("{0} {1}", name.First, name.Last).Trim();
于 2012-07-24T18:42:13.060 回答
2
string SpeakerName = name.First != null && name.Last != null 
                     ? string.Format("{0} {1}", name.First, name.Last) 
                     : string.Empty;
于 2012-07-24T18:43:54.707 回答
-1
string fullName = (name.First + " "  +  name.Last).Trim();

这适用于其中一个或两个为空,并且不会返回带有前导、尾随或只有空格的字符串。

于 2012-07-24T18:55:10.893 回答