c#null string?

Nat*_*Pet 0 c# operator-precedence null-coalescing-operator

我有以下内容:

string Name = name.First + " "  +  name.Last;
Run Code Online (Sandbox Code Playgroud)

这Tom Jones很好.

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

string SpeakerName = name.First ?? string.Empty + " "  +  name.Last ?? string.Empty;
Run Code Online (Sandbox Code Playgroud)

奇怪的是它只会返回Tom.为什么这个以及如何修复它以if null使其默认为空名字符串为姓或名?

Chr*_*ain 12

因为??的相对优先权 和+运营商.试试这个:

string SpeakerName = (name.First ?? "") + " " + (name.Last ?? "");
Run Code Online (Sandbox Code Playgroud)

您的原始示例正在评估它是否:

string SpeakerName = name.First ?? ("" + " "  +  (name.Last ?? ""));
Run Code Online (Sandbox Code Playgroud)

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

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

string SpeakerName = name.First + " " + name.Last;
Run Code Online (Sandbox Code Playgroud)

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

string SpeakerName = String.Format("{0} {1}", name.First, name.Last)
Run Code Online (Sandbox Code Playgroud)

编辑:

您还要求第一个和最后一个== null使结果为空字符串.通常,这可以通过调用.Trim()结果来解决,但这并不完全等效.例如,如果名称不为空,您可能由于某种原因想要前导或尾随空格,例如"Fred"+"Astair"=>"Fred Astair".我们都假设你想要修剪它们.如果你不这样做,那么我建议使用一个条件:

string SpeakerName = name.First + " " + name.Last;
SpeakerName = SpeakerName == " " ? String.Empty : SpeakerName;
Run Code Online (Sandbox Code Playgroud)

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


L.B*_*L.B 6

string SpeakerName = String.Format("{0} {1}", name.First, name.Last).Trim();
Run Code Online (Sandbox Code Playgroud)