调用方法的条件返回方法呢?

时间:2010-04-03 08:41:33

标签: c# code-contracts

好吧这可能是一些黑客攻击但是请耐心等待:)背景是我厌倦了一些方法,那些if语句会弄乱整个方法,例如:

public SomeClass DoStuff(string inputStr)
{
  SomeClass result =null;
  if (IsOpenFilter(inputStr))
  {
    ....
  }

  return result;
}

所以我在想,如果我可以这样做,那不是很好吗:

public SomeClass DoStuff(string inputStr)
{
  Require(IsOpenFilter(inputStr),null);


  ....

  return result;
}

这种情况可能会被代码合同以某种形式涵盖,如果是这样,请纠正我:)

这个想法是,如果语句的计算结果为true,它将返回null。如果没有该方法的返回类型,它只是:Require(IsOpenFilter(inputStr));

所以我想有两个问题,这可以用某种方式完成吗?我对如何通过调用方法进行条件返回感到难过。

另一个问题是,这是一个好主意吗? monkeypatch这样的语言有点奇怪,但我更喜欢代码读取的方式。如果它可以放在方法上面的属性中,我会更干净:[Require(IsOpenFilter(inputStr))]

2 个答案:

答案 0 :(得分:7)

我同意安德斯:反转条件并尽早返回。当您需要在该返回点明确地执行大量资源清理时,“单一返回点”曾经很有价值;使用finally块,using语句和垃圾收集它甚至都不是一个有用的指南,IMO。每当你发现自己做只是以获得单个返回点时,请考虑它是否实际上使代码更具可读性。

我几乎总能发现,如果在代码中的某个时刻我知道返回值,并且我不想在方法中采取其他操作,那么最好是立即返回。强迫读者浏览方法的其余部分以防万一,另一个动作既不优雅也不实用,IMO。

我认为方法不能表明它应该导致调用者返回是一件好事 - 这种能力听起来像是一种可读性的噩梦。话虽如此,我已经考虑了一种新的条件返回语句:

return? expression;

如果它是非空的话,这将返回expression的评估值;您可以将它用于非可空类型,如下所示:

int Foo()
{
    return? Bar(); // Where Bar() has a return type of int?
    ...
}

基本上它将是null语句等效的返回语句。

这对你的情况没有帮助,请注意 - 你希望早点返回null ...

答案 1 :(得分:3)

如何重写你的第一个例子:

public SomeClass DoStuff(string inputStr) 
{ 
  if (!IsOpenFilter(inputStr)) 
      return null;

  SomeClass result =null; 

  // Some code .... 

  return result; 
} 

看起来你正试图坚持每个函数中一个返回点的旧约定。简而言之:获得一次回报是具有明确资源处理的语言的遗产。长篇故事可以在一些旧的SO帖子中找到: