• 缕一缕c#可null类型


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


    非null引用类型demo

     

     

     可null引用类型demo

     

     

     

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

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

  • 相关阅读:
    CRM PrincipalObjectAccess(POA)
    crmForm.SubmitCRMForm
    transactionCurrencyId needs to be supplied to format a transaction money field.
    GitLab 之 Linux十分钟快装
    GitLab 之 Linux十分钟快装
    秒杀系统架构分析与实战
    秒杀系统架构分析与实战
    秒杀系统架构分析与实战
    创建微服务?请先回答这10个问题
    创建微服务?请先回答这10个问题
  • 原文地址:https://www.cnblogs.com/axzxs2001/p/16199035.html
Copyright © 2020-2023  润新知