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

したがって、特に1つしかない場合は、追加の宣言を行うことは大したことではありません。コードはまだ読み取り可能です。

複数のネストされたtry/catchステートメントの場合、設計上の適切な決定は、関連するすべてのロジックを含む各try / catchブロックを、true/falseまたは呼び出し元のコンテキストで役立つ結果を返す個別の関数に配置することです。

于 2012-06-22T13:00:20.803 に答える
1

C#にはDのスコープに相当するものがないため、ほとんどがに委託されていtry..finallyます。

参照:D例外安全性

于 2012-06-22T13:12:14.383 に答える
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 に答える