• C#常见错误:未将对象引用到实例
  • 发布于 2个月前
  • 190 热度
    0 评论
相信你一定遇到过这种异常:未将对象引用到实例(System.NullReferenceException:“Object reference not set to an instance of an object.”),是这,这应该是所有C#程序员都熟悉的异常,但即使是老手,也不可能百分百杜绝。

首先值类型不能直接为null,是通过在类型后加“?”的方式来扩展可空值类型:
// 堆代码 duidaima.com
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>();
}

用户评论