2010-04-24 114 views
0

你喜欢哪一个编码风格:空合并运算符或条件运算

object o = new object(); 
//string s1 = o ?? "Tom"; // Cannot implicitly convert type 'object' to 'string' CS0266 
string s3 = Convert.ToString(o ?? "Tom"); 
string s2 = (o != null) ? o.ToString() : "Tom"; 

S2或S3?

可以缩短吗? s1显然不起作用。

+0

感谢您的所有答案。我还应该包括,我正在寻找“是否o预期是一个字符串”。 – rkrauter 2010-04-24 16:52:51

回答

5

在这种情况下,我认为我的偏好是:

string s1 = (string)o ?? "Tom"; 

或者:

string s1 = (o as string) ?? "Tom"; 

取决于是否o真的预计是一个string与否。无论哪种方式,我更喜欢这些,因为他们更好地表达了正在做的事情,并且如果o已经是string,那么不要通过不必要的转换。


作为一般规则,我更喜欢哪个更清楚和/或实际工作。当操作字符串,我常常需要写这样的事情,而不是:

string result = !string.IsNullOrEmpty(value) ? value : "Default"; 

...这真的不能在所有与空合并运算符来完成。在另一方面,如果我试图凝聚了大量的值,它是更好的约500倍:

var result = firstTry ?? secondTry ?? thirdTry ?? fourthTry ?? fifthTry; 

尝试编写与三元运算符。

如果这种差异不是那么戏剧化,如果它只是一行代码中的几个字符,那真的没什么关系,只要使用任何你喜欢的东西。

1

这也将工作,虽然在一根绳子上调用ToString感觉有点怪:

string s4 = (o ?? "Tom").ToString(); 
1

对于这种情况,我宁愿使用三元运算符,因为它表达的意图更加清晰,避免了冗余呼叫到Convert.ToString()。一般来说,如果转换为相同类型的对象,我宁愿使用空合并运算符,例如

string s1 = null; 
string s2 = s1 ?? string.Empty; 
1

IMO,我倾向于使用:

var s = obj ?? "tom"; 

s是相同的类型obj而不使用Convert或任何其他类型的铸造的。

然后,我用:

var s = obj != null 
    ? obj.ToString() 
    : "tom"; 

当我需要分配给左侧前投或有一些其他类型的右侧改造......

只是我的编码风格, 我想。

1

我不喜欢。将对象转换为特定类型充满了麻烦,它永远不应该隐藏在表达式中。我更希望如果炸弹爆炸,那么它就会在特定的声明中这样做。并且让这个转换正在完成的代码阅读器显而易见。所以,在最低限度:

string s1 = o as string; 
string s2 = s1 ?? "Tom";