我知道做以下事情是没有意义的:
xstring.ToLower()??"xx"
因为我在调用null之前调用了ToLower()
。
有没有办法解决这个问题,保持语法清晰干净?
我可以覆盖字符串的??
运算符,以便在ToLower()
不是xstring
时只调用null
吗?
答案 0 :(得分:8)
不,你不能超载该运营商。只需将.ToLower
放在合并之外:
(xstring ?? "xx").ToLower();
答案 1 :(得分:8)
您要找的是Monadic Null Checking。它目前在C#5中不可用,但显然它将在C#6.0中提供。
来自this post:
在访问属性或方法之前,不需要检查空值。在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();
正如其他答案所示。
答案 2 :(得分:4)
否,但有传言称为此目的将?.
运算符添加到下一版本的C#中。请参阅http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated
答案 3 :(得分:3)
如果你想避免使用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")
答案 4 :(得分:3)
ToLower()
后应用null
方法:
(xstring ?? "xx").ToLower();
答案 5 :(得分:2)
根据ECMA-334你不能覆盖?操作
答案 6 :(得分:2)
我将看到的唯一解决方案是:
(xstring ?? "xx").ToLower();
但是,我认为如果你做了一些事情会更好看
xstring != null ? xstring.ToLower() : "xx"
答案 7 :(得分:2)
您可以使用:
(xstring ?? "xx").ToLower()
语法简单,意图明确。在缺点方面,您将在ToLower
上运行"xx"
,并添加了一些括号。