一個從沒見過的C# ?.語法


      上周下了NanUI的源碼跟示例代碼,這一段時間一直在研究其源代碼。在其中發現了一個從沒見過,而又被這個開源項目很多地方使用的語法,?.語法,如下2圖所示,百度搜索只找到只有描述?、??和? :語法的,而沒看到?.功能描述。

1

2

我對?.語法的總結

語法結構 表達式 ? .[屬性|方法]
功能推測 表達式為空時,返回空,或者不調用任何方法,否則返回后面指定的屬性或者調用后面的方法。
返回值 根據屬性|方法的設置確定,見以下注意點的描述
注意: 1、表達式(所指並非整個語法結構)返回結果的數據類型必須是可空數據類型,如果是諸如bool、int、long等值類型數據類型,是無法使用?.語法的;
  2、點號后面可以調用的屬性和方法屬於前面表達式的。例如第1個例子中,Invoke()方法是action變量的方法。你不能調用其它變量的屬性方法;
  3、當點號后面的是屬性時,整個語法結構必定有返回值,如圖2所示。表達式為空時,返回空,否則返回后面指定的屬性。
  4、當點號后面的是方法時,整個語法結構是否有返回值,取決於該方法是否有返回值。如上面第1張圖,由於Invoke()方法返回值類型為void,所以最終沒有返回值。

有趣的事情:

      以上說到點號后面是屬性或者是方法,且方法有返回值時,最終整個語法有返回值,另外我們又說表達式應該是可空類型。假設點號后面調用的屬性或方法返回值類型是非可空類型的,也就是說諸如bool、int、long等值類型數據類型,那么最終的整個語法結構的返回值類型會是什么了?

      1、首先我多加了一個擴展Action的函數,函數返回值為int非可空類型,代碼如下所示:

public static int GetIntValue(this Action action)
{
    return 20;
}

      2、然后我們寫一行如下所示的代碼,此時我們會發現VS IDE提示語法錯誤,如下圖所示:

int v= action?.GetIntValue();

      3

      3、然后我們將代碼數據類型聲明int更換為var,在監視窗口中添加變量v的監視項,打上斷點,啟動調試,會看到如下所示的結果。

      4

      4、總結下,如果點號后面調用的屬性或者方法的返回值類型為值類型數據類型時,整個語法結構的返回值的數據類型會被VS自動轉換為對應的可空類型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM