空合并运算符或条件运算
问题描述:
你喜欢哪一个编码风格:空合并运算符或条件运算
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显然不起作用。
答
在这种情况下,我认为我的偏好是:
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;
尝试编写与三元运算符。
如果这种差异不是那么戏剧化,如果它只是一行代码中的几个字符,那真的没什么关系,只要使用任何你喜欢的东西。
答
这也将工作,虽然在一根绳子上调用ToString
感觉有点怪:
string s4 = (o ?? "Tom").ToString();
答
对于这种情况,我宁愿使用三元运算符,因为它表达的意图更加清晰,避免了冗余呼叫到Convert.ToString()
。一般来说,如果转换为相同类型的对象,我宁愿使用空合并运算符,例如
string s1 = null;
string s2 = s1 ?? string.Empty;
答
IMO,我倾向于使用:
var s = obj ?? "tom";
当s
是相同的类型obj
而不使用Convert
或任何其他类型的铸造的。
然后,我用:
var s = obj != null
? obj.ToString()
: "tom";
当我需要分配给左侧前投或有一些其他类型的右侧改造......
只是我的编码风格, 我想。
答
我不喜欢。将对象转换为特定类型充满了麻烦,它永远不应该隐藏在表达式中。我更希望如果炸弹爆炸,那么它就会在特定的声明中这样做。并且让这个转换正在完成的代码阅读器显而易见。所以,在最低限度:
string s1 = o as string;
string s2 = s1 ?? "Tom";
感谢您的所有答案。我还应该包括,我正在寻找“是否o预期是一个字符串”。 – rkrauter 2010-04-24 16:52:51