null-coalescing运算符或条件运算符

时间:2010-04-24 15:04:20

标签: c#

您更喜欢哪种编码风格:

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显然不起作用。

5 个答案:

答案 0 :(得分:5)

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

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

或者:

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

取决于o是否真的预期是否为string。无论哪种方式,我更喜欢这些,因为他们更好地表达了正在做的事情,如果o已经是string,则不要通过不必要的转换传递这些内容。


作为一般规则,我更喜欢哪个更清晰和/或实际工作。使用字符串时,我经常需要写这样的东西:

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

...使用null-coalescing运算符完全无法完成。另一方面,如果我想要合并大量的值,它会好大约500倍:

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

尝试用三元运算符写一下。

如果差异不是那么显着,如果在一行代码中只是几个字符,那真的没关系,只要使用你喜欢的任何东西。

答案 1 :(得分:1)

虽然在字符串上调用ToString感觉有点奇怪,但这也有效:

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

IMO,我倾向于使用:

var s = obj ?? "tom";

sobj的类型相同而不使用Convert或任何其他类型的广告时。

然后,我使用:

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

当我需要在分配到左侧之前在右侧施放或进行其他类型的转换时...

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

答案 4 :(得分:1)

我也不喜欢。将对象转换为特定类型充满了麻烦,它永远不应该隐藏在表达式中。我更喜欢它,如果它是炸弹,那么它就是在特定声明中这样做。并且使代码的读者明白这种转换正在进行中。所以,至少:

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