【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>();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值