我知道这样做是没有意义的:
xstring.ToLower()??"xx"
因为在检查 null 值之前调用了 ToLower() 方法。 有没有办法解决这个问题,同时保持语法简洁明了? 我是否可以重写字符串的 ?? 运算符,以便仅在 xstring 不为 null 时调用 ToLower() 方法?
我知道这样做是没有意义的:
xstring.ToLower()??"xx"
在访问属性或方法之前,消除了检查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
放在空值合并操作符的外面:
(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();
你可以使用以下方法:
(xstring ?? "xx").ToLower()
语法简单,意图明确。不足之处在于您将对"xx"
运行ToLower
并添加了一些括号。
(xstring ?? "xx").ToLower();
xstring != null ? xstring.ToLower() : "xx"