可空类型(?)、空接合运算符(??)、三元运算符(?:)、NULL检查运算符(?.)

本文深入探讨C#中的可空类型,解释如何使用可空类型修饰符(?)创建值类型变量,并能将其设为null。文章介绍了可空类型与非可空类型之间的转换、空接合运算符(??)的用法、可空用户自定义类型以及Nullable<T>的实现方式。通过代码示例,展示了如何在实际应用中有效利用这些特性。

可空类型修饰符(?)

可空类型允许我们创建一个值类型变量并且可以标记为有效或无效,这样我们就可以有效的把值类型设置为“null,在处理数据库和其他包含可能未赋值的元素的数据类型时,将null赋值给数值类型或布尔类型的功能特别有用,例如数据库中的布尔类型字段可以存储值true或false,或者该字段也可以未定义。

可空类型总是基于另外一个叫做基础类型的已经被声明的类型,可以从任何值类型创建可空类型,包括预定义的简单类型,不能从引用类型或其他可空类型创建可空类型不能在代码中显式声明可空类型,只能声明可空类型的变量,之后我们会看到,编译器会使用泛型隐式地创建可空类型,创建可空类型的变量,只需要在变量声明中的基础类型的名字后面加一个问号

        static void Main(string[] args)
        {
            //a i b值都为null
            int? a = null;
            int? i = new int?();
            bool? b = new bool?();

            int? myNInt = 100;
            if (myNInt != null)  //直接与null比较
                Console.WriteLine(myNInt);  
            if(myNInt.HasValue)  //通过检查它的HasValue属性
                Console.WriteLine(myNInt);
        }

可空类型与非可空类型之间的转换

(1)非可空类型--->可空类型    为隐式,不需要强制转换
(2)可空类型--->非可空类型    需要显式转换

空接合运算符(??)

空接合运算符由俩个连续的问号组成,它允许我们在可空类型变量为null时返回一个值给表达式,它有俩个操作数,第一个操作数是可空类型的变量,第二个是相同基础类型的不可空值,在运行时,如果第一个操作数运算后为null,那么第二个操作数就会被返回为运算符结果。简单来讲就是如果??左边操作数为null,则返回??右边的操作数。空接合运算符为右结合运算符,即操作时从右向左进行组合的,如a??b??c的形式按a??(b??c)计算。

        static void Main(string[] args)
        {
            int? i = null;
            Console.WriteLine(i ?? -1);  //-1
            i = 4;
            Console.WriteLine(i ?? -1);  //4
        }

可空用户自定义类型

我们可以创建用户自定义值类型的可空形式,它的主要问题是访问封装的基础类型的成员,一个可空类型不直接暴露基础类型的任何成员,例如struct的字段是公共的,它可以被结构的任何实例所访问到,然而,结构的可空形式只通过Value属性暴露基础类型,它不直接暴露它的任何成员,尽管这些成员对结构来说是公共的,但是它们对可空类型来说不是公共的

        struct S
        {
            public int X;
            public int Y;
            public S(int xVal,int yVal)
            {
                X = xVal; Y = yVal;
            }
        }
        static void Main(string[] args)
        {
            S? s = new S(5, 10);
            S s1 = new S(6, 12);

            Console.WriteLine("{0}  {1}", s1.X, s1.Y);    //非可空类型的访问
            Console.WriteLine("{0}  {1}", s.Value.X, s.Value.Y);  //可空类型的访问
        }

Nullable<T>

可空类型通过一个叫做Syatem.Nullable<T>的.NET类型来实现,它使用了C#的泛型特性,C#可空类型的问号语法是创建Nullable<T>类型变量的快捷语法,Nullable<T>接受了基础类型并把它嵌入结构中,同时给结构提供可空类型的属性、方法和构造函数。

    public class Program
    {
        struct S
        {
            public int X;
            public int Y;
            public S(int xVal,int yVal)
            {
                X = xVal; Y = yVal;
            }
        }
        static void Main(string[] args)
        {
            S? s = new S(5, 10);
            Nullable<S> s1 = new Nullable<S>((S)s);

            Console.WriteLine("{0}  {1}", s.Value.X, s.Value.Y);  
            Console.WriteLine("{0}  {1}", s1.Value.X, s1.Value.Y);  
        }
    }

三元运算符(?:)

主要用于替代if else的判断形式,例如:x?y:z表示如果表达式x为true,则返回y,如果x为false,则返回z。

NULL检查运算符(?.)

?.左边的对象如果为NULL,则不进行后面的获取成员的运算,直接返回NULL

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

//使用?.来代替
int? firstX = points?.FirstOrDefault()?.X;

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值