Fork me on GitHub

C#点点滴滴】用合适的方式处理null

  相信你一定遇到过这种异常:未将对象引用到实例(System.NullReferenceException:“Object reference not set to an instance of an object.”),是这,这应该是所有C#程序员都熟悉的异常,但即使是老手,也不可能百分百杜绝。

  首先值类型不能直接为null,是通过在类型后加“?”的方式来扩展可空值类型:

int i1 = default;
Console.WriteLine(i1);
int? i2 = null;
Console.WriteLine(i2 ?? 0);
Console.WriteLine(i2.HasValue ? i2.Value : 0);

  引用类型本身是可以为null的,这时就比较难办了,如果为了防止null,应该在所有三方调用的地方,只要返回是引用类型,就加判空,也是一个不少的工作量。所以,在定义引用类型的时候,通过在类型后面加“?”,来区分结果是否有null,用这种约定,来选择判断空,就会好很多。

复制代码
string? s1 = string.Empty;
Console.WriteLine(s1.Length);
string? s2 = default;
Console.WriteLine((s2 ?? string.Empty).Length);

Console.WriteLine(string.Empty == "");//true
Console.WriteLine(string.Equals(string.Empty, ""));//true
Console.WriteLine(string.Empty == null);//false
Console.WriteLine(string.Equals(string.Empty, null));//false
复制代码

  下面是一个自定义的类型Order:

public record Order(int Id, string Name, string? Description = null);

  如果查询单个实体,如果可以为空,就要用Order?定义,那么调用的地方就要判空,如果返回值是Order,要保证返回值一定不为null。

复制代码
Order? GetOrder1()
{
    return default(Order);
    //return null;
}
Order GetOrder2()
{
    return new Order(default, string.Empty, default);
}
复制代码

  如果是集合,非null集合,可以通过下面的形式返回非空的集合,这些集合都不为null,元素个数为0。

复制代码
IEnumerable<Order> GetOrders1()
{
    return Enumerable.Empty<Order>();
}
IList<Order> GetOrders2()
{
    return new List<Order>();
}
Order[] GetOrders3()
{
    // return new Order[0];
    return Array.Empty<Order>();
}
复制代码

  文章来源微信公众号

  想要更快更方便的了解相关知识,可以关注微信公众号 

posted @   桂素伟  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示