• 一个从没见过的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自动转换为对应的可空类型

  • 相关阅读:
    NET 4.+ & .NET CORE 高性能 轻量级 ORM框架,众多.NET框架中最容易使用的数据库访问技术
    mvc cookie
    正则表达式捕获带有属性的标签
    IT第十天
    代码段
    关于java.lang中String类的学习:最特殊的数据类型(持续整理中......)
    关于String.concat()方法和StringBuffer.append()方法的学习:方法是如何追加字符到源字符串的
    关于String和StringBuffer的理解问题:指针、变量的声明、变量的值的变化
    关于字符串检索、关键词的搜索问题:已搜索过的部分不会再被纳入下次搜索的范围内
    IT第九天
  • 原文地址:https://www.cnblogs.com/alexywt/p/9903152.html
Copyright © 2020-2023  润新知