C#基础-空处理

在c#中,值对象 是没有办法赋值为null的。比如说,你想要定义一个布尔值,你的赋值数据要么得是true、要么就得是false,默认情况下我们永远没可能给这个布尔赋值为null,即使只是对这个变量进行声明而不初始化数据,c#编译器也会给他在声明的同时赋予默认的初始化数据。布尔的初始化数据为false,整数、浮点数为0。

不过,在实际工作中,我们难免会遇到需要给值类型对象赋值为null的情况。比如说,我们在数据库有个客户列表,保存了客户的姓名、电话、出生日期等数据,而出生日期不是必选项,所以,在数据库中有可能存在客户没有留下生日的情况。

出生日我们需要使用DateTime类型来处理,但是DateTime类型在c#中是值类型对象(struct) ,没有办法赋值为null。所以,对于没有出生日期的情况,反应在代码中我们就需要给DateTime做一些特殊处理,让他可以赋值为null了。

一、Nullable

C#为类似上述情况提供的专门进行空处理的可空类型Nullable,位于system命名空间中。

1、Nullable的使用

可空类型的创建:

Nullable的使用方式很简单,以DateTime为例,在Nullable后面加上箭头括号,泛型为DateTime。现在,我们的date变量就可以被设置为null了。

csharp 复制代码
Nullable<DateTime> date = null;

因为可控类型很常用,因此c#还很贴心得给这种类型设计了独特的语法接口,通过语法糖来简化代码。

csharp 复制代码
DateTime? date = null;

2、Nullable的常用成员

bool HasValue:Nullable类型的属性成员,用于判断是否为空。

T Value:Nullable类型的属性成员,返回承载当前值的对应类型对象,如果为null则抛出异常。

T GetValueOrDefault():Nullable类型的方法成员,当为null时,返回承载默认值的对应类型对象,当不为null时候,返回承载当前值的对应类型对象。

csharp 复制代码
class Program
{
    static void Main(string[] args)
    {
        DateTime? date = null;
        Console.WriteLine(date.GetValueOrDefault());
        date = new DateTime(2022, 1, 2);
        if (date.HasValue)
        {
            Console.WriteLine(date.Value);
        }
    }
}

注意:不能把一个Nullable的Datetime直接赋值给普通的Datetime,因为他们两者的类型是截然不同的,c#编译器不知道应该怎么处理这种情况。

二、合并运算符 ??

现在假设有一个需求,打印Nullable<DateTime>变量date的日期,但有个要求,就是只有date有数据的时候,才显示date的日期;否则显示今天的日期。如果不使用合并运算符,一般会写成如下代码:

csharp 复制代码
static void Main(string[] args)
{
    DateTime? date = null;
    if (date != null)
    {
        Console.WriteLine(date.GetValueOrDefault());
    }
    else
    {
        Console.WriteLine(DateTime.Today);
    }
}

在实际工作中,我们有大量的代码都需要做类似的处理,先进行非空判断,然后再执行逻辑。不过,这坨代码其实很啰嗦,对于可空数据的处理,c#提供了一个非常强大的语法结构进行处理,就是连续使用两个问号,即合并运算符??。

语法:变量a ?? 变量b/表达式

连续两个问号是Coalescing Operator,中文叫做合并运算 。这是一个逻辑操作符,当左侧的变量为null时,他将会返回合并操作符右侧数据,否则合并操作将会提取左侧的变量的真实数据,并且返回这个数据。于是,上面的代码就可以简写为:

csharp 复制代码
static void Main(string[] args)
{
    DateTime? date = null;
    var result = date ?? DateTime.Today;
    Console.WriteLine(result);
}
相关推荐
David猪大卫3 分钟前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
用户37215742613532 分钟前
C# 实现 Excel 单元格保护:锁定公式并允许编辑指定区域
c#·ai编程·编程语言
fengci.1 小时前
CTF2MISC中等部分
开发语言·前端·学习
xys_6783 小时前
JavaEE通关手册:初识Java
java·开发语言
ShineWinsu4 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu5 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
吴名氏.5 小时前
Java转AI Agent教程(第十二周)检索与切分
java·开发语言·人工智能·ai·ai agent
公子小六6 小时前
基于.NET的Windows窗体编程之WinForms数据持久化(1)
windows·microsoft·c#·.net·winforms
瑞雪兆丰年兮6 小时前
JavaWeb-day10-SpringBootWeb案例
java·开发语言·javaweb·web
Elastic 中国社区官方博客6 小时前
更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描
大数据·运维·开发语言·人工智能·elasticsearch·搜索引擎