簡體   English   中英

空結合運算符覆蓋

[英]Null coalescing operator override

我知道做以下事情是沒有意義的:

xstring.ToLower()??"xx"

因為我在調查null之前調用了ToLower() 有沒有辦法解決這個問題,保持語法清晰干凈?

我可以覆蓋?? 字符串的運算符,以便在xstring不為null時只調用ToLower()

不,你不能超載該運營商。 只需將.ToLower放在.ToLower之外:

(xstring ?? "xx").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();

正如其他答案所示。

不,但有傳言說?. 為此,將運算符添加到下一版本的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 ,並添加了一些括號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM