您更喜欢哪种编码风格:
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 :(得分: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";
当s
与obj
的类型相同而不使用Convert
或任何其他类型的广告时。
然后,我使用:
var s = obj != null
? obj.ToString()
: "tom";
当我需要在分配到左侧之前在右侧施放或进行其他类型的转换时...
我想,只是我的编码风格。
答案 4 :(得分:1)
我也不喜欢。将对象转换为特定类型充满了麻烦,它永远不应该隐藏在表达式中。我更喜欢它,如果它是炸弹,那么它就是在特定声明中这样做。并且使代码的读者明白这种转换正在进行中。所以,至少:
string s1 = o as string;
string s2 = s1 ?? "Tom";