可空类型Nullable和空合并操作符(?? 操作符)

01.可空类型是值类型,只是可空类型是包括null的值类型的
int? 就是可空的int类型
"?"这个修饰符只是C#提供的一个语法糖(所谓语法糖,就是C#提供的一种方便的形式,其实肯定没有int? 这个类型,这个int?编译器认为的就是Nullable类型,即可空类型]
Nullable(这个T就是上专题介绍的泛型参数,其中T只能为值类型,因为从可空类型的定义为:public struct Nullable where T : struct)和Nullable在这里插入图片描述

            //定义1
            int? value = 1;
            //定义2
            Nullable<int> value2 =new Nullable<int>(1);
            
            WriteLine(value.GetType());
            WriteLine(value2.GetType());

在这里插入图片描述
02.为啥需要null类型
在设计数据库的时候,我们可以设置数据库字段允许为null值,如果数据库字段是日期等这样在C#语言是值类型时,当我们把数据库表映射一个对象时,此时Datetime类型是值类型,在C# 语言中是不能为null的,如果这样就会与数据库的设计有所冲突,这样开发人员就会有这样的需求了——值类型能不能也为可空类型的

03.hasvalue属性
HasValue 属性代表指示可空对象是否有值
在使用Value属性时必须先判断可空类型是否有值,
如果可空类型对象的HasValue返回false时,将会引发InvalidOperationException异常

            int? value = null;
            Nullable<int> value2 =new Nullable<int>(1);
            WriteLine(value2.HasValue); //true
            WriteLine(value.HasValue); //false
         
using System;
using static System.Console;
namespace Generic5
{
    class Program
    {
        static void Main(string[] args)
        {
            //定义1
            int? value = 200;
            //定义2
            Nullable<int> value2 =new Nullable<int>(100);
            WriteLine("可空类型有值的输出情况");
            Display(value);
            Display(value2);
            WriteLine("可空类型没有值的输出情况");
            value = null;
            value2 = null;
            Display(value);
            Display(value2);
            ReadKey();
        }

        private static void Display(int? nullable)
        {

            if (nullable.HasValue)
            {
                WriteLine($"值为:{nullable.Value}");
            }

            if (!nullable.HasValue)
            {
                //如果可空对象有值,就用它的值返回,如果可空对象不包含值时,使用默认值0返回,也可以自己设置默认值
                WriteLine($"默认值{nullable.GetValueOrDefault()}"); 
            }

            
        }
    }
}

在这里插入图片描述
在这里插入图片描述
05.空合并操作符
??操作符也就是"空合并操作符",它代表的意思是两个操作数,如果左边的数不为null时,就返回左边的数,如果左边的数为null,就返回右边的数,这个操作符可以用于可空类型,也可以用于引用类型,但是不能用于值类型(之所以不能应用值类型(这里除了可空类型),因为??运算符要对左边的数与null进行比较,然而值类型,不能与null类型比较,所以就不支持??运算符)
??这个运算符可以方便我们设置默认值,可以避免在代码中写if, else语句,简单代码数量,从而有利于阅读

  class Program
    {
        static void Main(string[] args)
        {
            Operator();
            ReadKey();
        }

        static void Operator()
        {
            int? nullable = null;
            int? nullhasvalue = 10;

            // ??和三目运算符的功能差不多的
            // 所以下面代码等价于:
            // x=nullable.HasValue?b.Value:12;
            int x = nullable ?? 12;

            // 此时nullhasvalue不能null,所以y的值为nullhasvalue.Value,即输出1
            int y = nullhasvalue ?? 123;

            WriteLine($"可空类型没有值的情况:{x}");
            WriteLine($"可空类型有值的情况:{y}");


            // 同时??运算符也可以用于引用类型, 下面是引用类型的例子
            string a = "123";
            string b = null;

            string result = a ?? "456";
            string result2 = b ?? "100";

            WriteLine($"引用类型不为null的情况:{result}");
            WriteLine($"引用类型为null的情况:{result2}");

        }
    }

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值