上周下了NanUI的源码跟示例代码,这一段时间一直在研究其源代码。在其中发现了一个从没见过,而又被这个开源项目很多地方使用的语法,?.语法,如下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、然后我们将代码数据类型声明int更换为var,在监视窗口中添加变量v的监视项,打上断点,启动调试,会看到如下所示的结果。
4、总结下,如果点号后面调用的属性或者方法的返回值类型为值类型数据类型时,整个语法结构的返回值的数据类型会被VS自动转换为对应的可空类型。