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

非null引用类型demo

缕一缕c#可null类型_赋值

 可null引用类型demo

缕一缕c#可null类型_对象引用_02


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

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

缕一缕c#可null类型_对象引用_03