2012-07-24 103 views
0

我有以下几点:c#空字符串?

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

这将返回Tom Jones就好了。

如果name.First可以为空或name.Last可以为空,我有以下几点:

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

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

+6

搜索“运算符优先级”。 – zzzzBov 2012-07-24 18:40:21

+1

?? “”是不需要的。 – hazzik 2012-07-24 18:41:07

+2

要跟踪hazzik:''null'在与'+'运算符一起使用时转换为“”字符串的操作数表达式之一。例如'name.First +“”+ name.Last'在这种情况下会产生相同的输出。同样,'string.Format(“{0} {1}”,name.First,name.Last)'会起作用。但是,通常,“First”或“Last”或“”“'仍然不是所需的输出,因此可以查看;-) – 2012-07-24 18:46:41

回答

12

由于相对优先的??和+运营商。试试这个:

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

你原来的例子正在评估,如果它是:也

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

,阅读Jon的答案在这里:What is the operator precedence of C# null-coalescing (??) operator?

由于他认为在那里,这应该工作以及:

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

因为编译到@ LB的回答如下,减去修剪:

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

编辑:

你还问我是第一个和最后两== NULL,使得结果为空字符串。通常,通过对结果调用.Trim()可以解决这个问题,但这不完全相同。例如,如果名称不为空,例如,您可能由于某种原因想要前导空格或尾随空格。 “Fred”+“Astair”=>“Fred Astair”。我们都假设你想修剪掉这些。如果你不这样做,那么我会建议使用条件:

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

如果您不希望的开头或结尾的空格,只需添加一个.Trim()为@ L.B。做

6
string SpeakerName = String.Format("{0} {1}", name.First, name.Last).Trim(); 
2
string SpeakerName = name.First != null && name.Last != null 
        ? string.Format("{0} {1}", name.First, name.Last) 
        : string.Empty; 
+0

+1用于阅读和理解...”,例如,如果null它默认为第一个或最后一个名字为空字符串“......就像我一样 – Les 2012-07-24 18:52:32

-1
string fullName = (name.First + " " + name.Last).Trim(); 

这适用于一方或双方被空,不会导致返回一个字符串,拖尾,或仅空间。