2

所有,这是一个简单的。finally有没有一种方法可以在不做的情况下测试块内的返回值

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

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

注意:我知道这不是我现在正在做的很多工作。我对 .NET 世界的复杂性很好奇。

4

3 回答 3

2

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

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

因此,拥有额外的声明并不是什么大不了的事,特别是如果它只有一个。代码仍然可读。

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

于 2012-06-22T13:00:20.803 回答
1

如果是我,我会有另一个变量来指示 finally 块中需要一些东西。

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

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

虽然 pukka .net 方式会在 using 块中建立连接,但最终不需要摆脱它。

如果你想坚持结果,那么

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

对我来说会更有意义,尽管对其他人来说可能不是......

于 2012-06-22T13:13:27.030 回答
1

由于 C# 没有等效于 D 的范围,因此您几乎只能使用try..finally.

另请参阅:D 异常安全

于 2012-06-22T13:12:14.383 回答