空结合运算符覆盖
我知道做以下事情是没有意义的:
xstring.ToLower()??"xx"
因为我在调查null之前调用了ToLower()
。 有没有办法解决这个问题,保持语法清晰干净?
我可以覆盖??
字符串的运算符,以便它只在xstring
不为null
时调用ToLower()
?
您正在寻找的是Monadic Null Checking 。 它目前在C#5中不可用,但显然它将在C#6.0中提供。
从这篇文章 :
7. Monadic null检查
在访问属性或方法之前,不需要检查空值。 在Groovy中称为安全导航操作符 )。
之前
if (points != null) { var next = points.FirstOrDefault(); if (next != null && next.X != null) return next.X; } return -1;
后
var bestValue = points?.FirstOrDefault()?.X ?? -1;
在此期间,只需使用
(xstring ?? "xx").ToLower();
正如其他答案所示。
不,你不能超载该运营商。 只需将.ToLower
放在.ToLower
之外:
(xstring ?? "xx").ToLower();
不,但有传言说?.
为此,将运算符添加到下一版本的C#中。 请参阅http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated上的 #7
如果你想避免使用ToLower() – 字面值“xx”,你就会遇到?:三元运算符。
xstring != null ? xstring.ToLower() : "xx"
或者你可以写一个扩展方法,但这看起来很奇怪。
public static string ToLowerOrDefault(this string input, this string defaultValue) { return (input != null ? input.ToLower() : defaultValue); }
然后你可以像这样使用:
xstring.ToLowerOrDefault("xx")
检查null
后应用ToLower()
方法:
(xstring ?? "xx").ToLower();
根据ECMA-334你不能覆盖? 操作者
标准ECMA-334
我会看到的唯一解决方案是:
(xstring ?? "xx").ToLower();
但是,我认为如果你做了什么会更好看
xstring != null ? xstring.ToLower() : "xx"
你可以使用:
(xstring ?? "xx").ToLower()
语法很简单,意图很明确。 在缺点方面,你将在"xx"
上运行ToLower
,并添加了一些括号。