测试最后块内的返回值

时间:2012-06-22 12:52:36

标签: c# try-finally

全部,这很简单。有没有办法在finally块内测试返回值而不执行

bool result = false;
try
{
    if (someCondition)
    {
        result = true;
        return result;
    }
    return result;
}
finally
{
    if (result)
     // Do something mind-blowing.
}

我是否必须使用变量result?有更简洁的方法吗?

注意:我知道现在做的事情并不是很多工作。我很好奇.NET世界的错综复杂。

3 个答案:

答案 0 :(得分:2)

简短的回答是:不,这是不可能的。我认为你最感兴趣的是你的代码具有良好的可读性。

有时你实际上需要引用finally块中的其他变量,即使你的函数返回了某些东西。 例如,如果您正在使用某些IDisposable实现并且您不希望或不能(为了保持可读性)使用using块,那么您需要在Dispose()块中finally它们。

所以,拥有额外的声明并不是什么大问题,特别是如果它只是一个。代码仍然可读。

对于多个嵌套的try / catch语句,一个好的设计决策是将每个try / catch块与所有与之相关的逻辑放在一个单独的函数中,该函数返回true / false或者在调用者的上下文中有用的结果

答案 1 :(得分:1)

由于C#与D scope没有相同之处,因此您几乎被委托给try..finally

另请参阅:D Exception Safety

答案 2 :(得分:1)

如果是我,我会有另一个变量来表明finally块中需要的东西。

你在另一条评论中提到SqlConnection,所以你可以这样做

if(myConnection!= null) {   myConnection.Dispose(); }

虽然pukka .net方式会在一个使用块中有连接,所以最后不需要摆脱它。

如果你想坚持结果那么

bool result = false;
try
{     
  if (someCondition)     
  {         
    result = true;         
  }     
} 
finally 
{     
  if (result)      // Do something mind-blowing. 
} 
return result;

对我来说会更有意义,但也许不会对其他人......