在具有 Nullable 引用类型新功能的 C# 9 中,我发现自己将“?” 在每个类属性类型上关闭警告,然后将if != null放在代码外部以避免空引用(这很好)。但我想知道,垃圾邮件“?”是否正确?到处?

假设我有一个类表示带有非可选外键的数据库记录:

public int UserId { get; set; }
public virtual User User { get; set; }

我希望虚拟属性始终不为空(因为它是由实体框架实例化的)所以我不想让它可以为空以删除类中的警告,而是我会将它的值初始化为“空!”。然后,如果实体框架无法按预期工作,我应该使用 try catch 块包装使用此属性的代码以捕获异常。

你怎么认为?垃圾邮件“?”更安全吗?并且总是重复if != null到处?


使用 C# 11,您可以创建这些required属性,从而避免该问题。在此之前,如果您确定该属性将由某些东西(例如 EF 或反序列化器)初始化,则可以将其声明为然后不检查使用站点= null!是否为null

我认为没有必要检查“实体框架是否无法按预期工作”。只有当你在开发过程中破坏了某些东西时才会发生这种情况,如果发生这种情况,很多东西都会发生灾难性的破坏。您可能会立即发现问题,您添加的任何额外的 try/catch 块可能只会妨碍您。我认为可以假设 EF 按您的代码中的预期工作

我会立即关闭我开始的任何新项目的可空引用类型 :)

@YungDeiza 你喜欢调试 NullReferenceExceptions 吗?

那么你应该喜欢让编译器在你编写任何测试之前警告你可能存在错误的地方;)