zoukankan      html  css  js  c++  java
  • C#中 ??、 ?、 ?: 、?.、?[ ] 问号

    1. 可空类型修饰符(?)

    引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。
    例如:string str=null; 是正确的,int i=null; 编译器就会报错。
    为了使值类型也可为空,就可以使用可空类型,即用可空类型修饰符"?“来表示,表现形式为"T?”
    例如:int? 表示可空的整形,DateTime? 表示可为空的时间。
    T? 其实是System.Nullable(泛型结构)的缩写形式,
    也就意味着当你用到T?时编译器编译时会把T?编译成System.Nullable的形式。
    例如:int?,编译后便是System.Nullable的形式。

    2. 三元(运算符)表达式(?: )

    例如:x?y:z 表示如果表达式x为true,则返回y;
    如果x为false,则返回z,是省略if{}else{}的简单形式。

    3. 空合并运算符(??)

    用于定义可空类型和引用类型的默认值。
    如果此运算符的左操作数不为null,则此运算符将返回左操作数,否则返回右操作数。
    例如:a??b 当a为null时则返回b,a不为null时则返回a本身。
    空合并运算符为右结合运算符,即操作时从右向左进行组合的。
    如,“a??b??c”的形式按“a??(b??c)”计算。

    4.NULL检查运算符(?.)  

    例如我们要获取一个Point序列的第一个点的X坐标,第一感觉会这么写:
    int firstX = points.First().X;
    但是,老鸟会告诉你,这儿没有进行NULL检查,正确的版本是这样的:

    int? firstX = null;
    if (points != null)
    {
      var first = points.FirstOrDefault();
      if (first != null)
      firstX = first.X;
    }

    正确倒是正确了,代码取变得难读多了。在C# 6.0中,引入了一个 ?. 的运算符,前面的代码可以改成如下形式:

    int? firstX = points?.FirstOrDefault()?.X;

    从这个例子中我们也可以看出它的基本用法:如果对象为NULL,则不进行后面的获取成员的运算,直接返回NULL

    需要注意的是,由于"?.“运算符返回的可以是NULL,当返回的成员类型是struct类型的时候,”?.“和”."运算符的返回值类型是不一样的。
     

     Point p = new Point(3, 2);
     Console.WriteLine(p.X.GetType() == typeof(int)); //true
     Console.WriteLine(p?.X.GetType() == typeof(int?)); //true

    5"?[]"运算符:

    int? first = customers?[0].Orders.Count();

    (这个不太清楚,感觉微软语法糖用过头了。)

    本质:都使用了语法糖,在编译阶段编译器会把特殊符号先转译成原始状态再编译。
     
    原文链接:https://blog.csdn.net/qq_42453390/article/details/90403344

  • 相关阅读:
    mysql 远程登陆不上
    hdu 5339 Untitled【搜索】
    SqlServer 书目
    passwordauthentication yes
    oracle 11g RAC ocfs2
    Oracle 11g RAC database on ASM, ACFS or OCFS2
    CentOS ips bonding
    Oracle 11g RAC features
    openStack 王者归来之 trivial matters
    openstack windows 2008 img
  • 原文地址:https://www.cnblogs.com/youmingkuang/p/11459615.html
Copyright © 2011-2022 走看看