什么时候在 C# 中返回空引用类型是正确的 [重复]

Posted

技术标签:

【中文标题】什么时候在 C# 中返回空引用类型是正确的 [重复]【英文标题】:When is it correct to return a null reference type in C# [duplicate] 【发布时间】:2017-11-13 15:48:37 【问题描述】:

我有一个预期会返回一个对象的 C# 方法。如果这个方法不抛出任何异常,我会更喜欢。

我的问题是,是否可以让方法返回 null 并因此将 null 检查责任交给调用方而无需进一步警告?

被调用者是否应该仅仅因为它是一个引用类型而假设该对象可能为空? (并且引用类型的默认值为 null: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/null)

请看下面我的例子

// this method is expected to return an object
public MyClass getObject()

  MyClass myObject = null;
  // Another option would be to initialize to a new instance, calling the default constructor and not setting any properties 
  // MyClass myObject = new MyClass(); // no null check needed by the caller, but it is a pretty useless object 

  try
  
    // just as an example  
    myObject = new MyClass();
  
  catch (Exception e)
  
    Console.WriteLine(e.Message);
  
  return myObject; // will return null when and exception occured


public class MyClass

  public int id  get; set; 
  public string name  get; set; 
 

【问题讨论】:

我不相信对此有正确或错误的答案,只要您在检查之前保持一致并评论为什么该值可能为空。 Should a retrieval method return 'null' or throw an exception when it can't produce the return value?的可能重复 【参考方案1】:

是的,你可以返回null,就像你当前正在做的那样,在这种情况下,调用者有责任在尝试访问对象的任何属性之前检查是否为空。使用 C# 6 语法

muobject?.Age

每个模式你可以使用Null Object Pattern;在这种情况下,您返回一个空对象而不是返回null。因此,即使调用者出错,它也不会被NullRefException 炸毁。出于验证目的,您可以检查属性值,例如 if(string.IsNullOrEmpty(myobject.name)) ....

【讨论】:

他当然可以,但他问是否最好返回 null 或更好地抛出异常/返回一个默认对象。如果他记录了行为并且与类似的方法一致,那么任何方法都可以。

以上是关于什么时候在 C# 中返回空引用类型是正确的 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 8 的可空引用类型

C#中的??是啥意思

C#中 ?? ? ?: ?.?[ ]

asp.net C# 中关于 var 类型的疑问?

C# Cognex,为啥他说空引用异常 [重复]

C# 8.0 和可为空引用类型