2

由于void签名是用来表示一个方法不返回任何东西的,这种方法,我这样写:

private void MyMethod()
{
    // Body of the method.
}

但是,在许多地方,我看到了不打算返回任何东西的方法,其编写方式如下:

private object MyMethod()
{
    // Body of the method

    return null;
}

从我的角度来看,两个代码片段都是一样的。那么,使用第二个的目的可能是什么?它们之间有什么区别?他们中的任何一个都比另一个更受欢迎吗?

4

8 回答 8

7

第二个按原样写,单次返回通常是没用的,它会稍微降低性能,并使 API 更难使用。然而,它可能有用的地方有细微的变化,例如:

  • 有多个返回点,这是最后一个表示缺少对象的返回点。例如,您可能会正常返回一个对象的实例,但由于某种原因,您这次没有。(例 1)

  • 如果方法标记不同,public virtual那么默认实现或被覆盖的方法可能不会返回值,但其他实现可能。(例 2)

示例 1:

public object MyMethod()
{
   if(myObj != null)
      return myObj.Result();

   return null;
}

示例 2:

// Derived Class
protected override object MyMethod()
{
    // We don't need a result from here so we don't have an implementation of
    // anything, but the base implementation doesn't make sense. This however
    // could be breaking SOLID principles.
    return null;
}

// Base Class
protected virtual object MyMethod()
{
    return new MyObj();
}
于 2013-06-18T08:31:15.033 回答
1

也许第二个可以用来调用异常处理

于 2013-06-18T08:33:01.077 回答
0

对于第二种,如果方法体中没有其他返回值,我会说它是没用的。只要保证方法不会返回任何值,请使用第一个。

于 2013-06-18T08:33:44.677 回答
0

第二种方法本身在你的情况下返回一些它的空值。我不觉得它是非价值返回方法。如果方法没有返回更好地练习 void

于 2013-06-18T08:34:34.023 回答
0

唯一好的做法是每次都返回一个 bool 值,以确认该方法是否成功接收到调用和参数,或者该方法是否成功执行了内部逻辑。

返回 aNULL是无用且具有误导性的......

于 2013-06-18T08:34:52.660 回答
0

对于第二个,调用者可以测试nullness,这是成功或失败的有用指示,如果由于某种原因,不希望抛出异常。第一个没有这样的设施。

于 2013-06-18T08:29:45.213 回答
0

二是误导。使用您的课程的人会期望在执行此方法后得到一些东西。如果它们在任何情况下都不打算返回有意义的值,则应避免编写此类方法。

即使你重写了返回有意义的类,你也应该考虑使用NullObject设计模式,这样你就不会破坏现有的 API 并遵循LSP。返回 null 会使用额外的 null 检查逻辑创建冗余,并且违反直觉。

于 2013-06-18T08:29:46.480 回答
0

第二个是不好的做法。我们没有必要告诉编译器检查返回类型。也许它是为未来的变化而做的。

于 2013-06-18T08:31:39.783 回答