繁体   English   中英

空推算运算符或条件运算符

[英]null-coalescing operator or conditional operator

您更喜欢哪种编码风格:

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";

...使用null-coalescing运算符根本无法完成。 另一方面,如果我尝试合并大量的值,则大约好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";

sobj类型相同时,不使用Convert或任何其他类型的转换。

然后,我使用:

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

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

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

我也不喜欢 将对象转换为特定类型会带来很多麻烦,永远不要将其隐藏在表达式中。 我非常希望这样做,如果它炸弹了,那么它会在特定声明中这样做。 为了使代码阅读者绝对清楚,此转换已完成。 因此,至少:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM