缕一缕c#可null类型

在古时候,引用类型是的默认值就是null,值类型是不可以赋值null的,所以那时候,“未将对象引用到实例”这个错误,是引用类型的。后来,值类型也可以赋值null了,只要在值类型变量定义的时候,加个?就可以,比如 int? i=null。到了c#8.0,引用类型又引入了可null引用类型,这里的意思不是引用类型不可以赋值null了,而是当使用可null引用类型时,不会报“未将对象引用到实例”的错误了。

非null引用类型demo

6d77e76963b3cb665d2567501c14f4c5.png

可null引用类型demo

34d78d12e8801a9bb14826dccce34e1f.png

.net6到来时,每个项目默认是支持可null引用类型的,在.csproj中有一个配置:<Nullable>enable</Nullable>,这样引入的好处是显而易见的,就会报空引用异常,但可能对于问题的排查带来一定的难度,不过换个角度,如果我们能按业务要求有效的验证非空,让不该空的有验证,让可空的不报错,从而来提升服务质量,岂不更好。

对于一些集合数组类型的使用,也有所区别,用for循环就能有效处理空引用的异常。

using static System.Console;


Order? order = null;
PrintOrder(order);


static void PrintOrder(Order? order)
{
    WriteLine($"OrderNo:{order?.OrderNo},Amount:{order?.Amount},OrderTime:{order?.Amount}");


    //这还是会发空引用异常
    //foreach (var detail in order?.Details)
    //{
    //    WriteLine($"GoodsID:{detail.GoodsID},Quantity:{detail.Quantity},Price:{detail.Price}");
    //}
    //这样就不会引发空引用异常
    for (int i = 0; i < order?.Details?.Count; i++)
    {
        var detail = order.Details[i];
        WriteLine($"GoodsID:{detail.GoodsID},Quantity:{detail.Quantity},Price:{detail.Price}");
    }
}


public class Order
{
    public string? OrderNo { get; set; }
    public decimal Amount { get; set; }
    public DateTime OrderTime { get; set; }
    public List<OrderDetail>? Details { get; set; }
}


public class OrderDetail
{
    public string? GoodsID { get; set; }
    public int Quantity { get; set; }
    public decimal Price { get; set; }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值