天天看点

缕一缕c#可null类型

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

非null引用类型demo

缕一缕c#可null类型

 可null引用类型demo

缕一缕c#可null类型

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

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; }
}