zoukankan      html  css  js  c++  java
  • C#---? ?? ?. ?: 好几种问号符号的使用方法




    参考博客:
    幽冥狂_七

    可空修饰符:?

    首先在C#中,引用类型可以为null,而值类型不能为null。

    为什么值类型不能为null,引用可以为null的解释
    https://www.cnblogs.com/Fflyqaq/p/14212505.html

    为了使值类型也可为空,就需要使用可空类型,即用可空类型修饰符"?“来表示,表现形式为"T?"。
    T?其实就是System.Nullable的缩写形式,编辑器会自动把T?编译成System.Nullable的形式。

    int n1 = null;    //编译报错
    GameObject g1 = null;
    
    //n2  n3二者等价
    int? n2 = 10;
    System.Nullable<int> n3 = 10;
    int? n4 = null;    //正常运行
    

    空合并运算符:??

    GameObject g1 = null;
    GameObject g2 = new GameObject();
    
    //如果g1不为null,返回g1。否则返回g2。
    GameObject g3 = g1 ?? g2;
    
    //右结合运算符,相当于g1 ?? (g2 ?? g3)
    GameObject g4 = g1 ?? g2 ?? g3;
    
    

    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中,引入了一个 ?. 的运算符,前面的代码可以改成如下形式:

    //如果points为null,则直接返回null
    int? firstX = points?.FirstOrDefault()?.X;
    

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

    Point p = new Point(3, 2);
    //二者类型不同
    Console.WriteLine(p.X.GetType() == typeof(int)); //true
    Console.WriteLine(p?.X.GetType() == typeof(int?)); //true
    

    三元表达式:?:

    //括号内为true,返回?后的,否则返回:后的。
    bool test = (10 == 11) ? true : false;
    
  • 相关阅读:
    BZOJ 1055 [HAOI2008]玩具取名
    BZOJ 1054 [HAOI2008]移动玩具
    BestCoder Round #51 (div.2)
    python对拍程序
    BZOJ 1053 [HAOI2007]反素数ant
    BZOJ 1051 [HAOI2006]受欢迎的牛
    Codeforces Round #315 (Div. 2)
    今天愉快的hack小记
    BZOJ 1050 [HAOI2006]旅行comf
    COJ 2135 Day10-例1
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/14212528.html
Copyright © 2011-2022 走看看