缕一缕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; }
}
想要更快更方便的了解相关知识,可以关注微信公众号
****欢迎关注我的asp.net core系统课程****
《asp.net core精要讲解》 https://ke.qq.com/course/265696
《asp.net core 3.0》 https://ke.qq.com/course/437517
《asp.net core项目实战》 https://ke.qq.com/course/291868
《基于.net core微服务》 https://ke.qq.com/course/299524
《asp.net core精要讲解》 https://ke.qq.com/course/265696
《asp.net core 3.0》 https://ke.qq.com/course/437517
《asp.net core项目实战》 https://ke.qq.com/course/291868
《基于.net core微服务》 https://ke.qq.com/course/299524