C#点点滴滴】用合适的方式处理null
相信你一定遇到过这种异常:未将对象引用到实例(System.NullReferenceException:“Object reference not set to an instance of an object.”),是这,这应该是所有C#程序员都熟悉的异常,但即使是老手,也不可能百分百杜绝。
首先值类型不能直接为null,是通过在类型后加“?”的方式来扩展可空值类型:
int i1 = default; Console.WriteLine(i1); int? i2 = null; Console.WriteLine(i2 ?? 0); Console.WriteLine(i2.HasValue ? i2.Value : 0);
引用类型本身是可以为null的,这时就比较难办了,如果为了防止null,应该在所有三方调用的地方,只要返回是引用类型,就加判空,也是一个不少的工作量。所以,在定义引用类型的时候,通过在类型后面加“?”,来区分结果是否有null,用这种约定,来选择判断空,就会好很多。
string? s1 = string.Empty; Console.WriteLine(s1.Length); string? s2 = default; Console.WriteLine((s2 ?? string.Empty).Length); Console.WriteLine(string.Empty == "");//true Console.WriteLine(string.Equals(string.Empty, ""));//true Console.WriteLine(string.Empty == null);//false Console.WriteLine(string.Equals(string.Empty, null));//false
下面是一个自定义的类型Order:
public record Order(int Id, string Name, string? Description = null);
如果查询单个实体,如果可以为空,就要用Order?定义,那么调用的地方就要判空,如果返回值是Order,要保证返回值一定不为null。
Order? GetOrder1() { return default(Order); //return null; } Order GetOrder2() { return new Order(default, string.Empty, default); }
如果是集合,非null集合,可以通过下面的形式返回非空的集合,这些集合都不为null,元素个数为0。
IEnumerable<Order> GetOrders1() { return Enumerable.Empty<Order>(); } IList<Order> GetOrders2() { return new List<Order>(); } Order[] GetOrders3() { // return new Order[0]; return Array.Empty<Order>(); }
文章来源微信公众号
想要更快更方便的了解相关知识,可以关注微信公众号
****欢迎关注我的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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?