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>();
}
文章来源微信公众号
想要更快更方便的了解相关知识,可以关注微信公众号
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2017-02-17 转义字符
2017-02-17 C#中唯一的三元运算符
2017-02-17 位运算