2012-05-14 4 views
5

私のメソッドは多くの点で返します。実行中にnewDataも多くの点で構築します。どこに戻っても、私は構築された結果を保存して保存する必要があります。 "return"を見逃すことはありません。try-finallyブロックでコードを囲んだので、今度はnewDataが格納されることを確信しています。try-finallyを使ってメソッドが終了したら何かが実行されることを確認するのは良いことですか?

List<X> newData = new List<X>(); 
try 
{ 
    .... 
    update newData 
    ..... 
    return; 
    ..... 
    .... 
    update newData 
    .... 
    update newData 
    return; 
    ..... 
    return; 
} finally 
{ 
    // copy newData to data  
} 

しかし、私は例外を捕まえていません。このコードは例外を処理するためのものではありません。一般的に受け入れることができますか、別のより良いアプローチを提案することはできますか?

+0

[switch文](http://msdn.microsoft.com/en-us/library/06tc147t%28v=vs.100%29.aspx)を使用できるようです。私はあなたがなぜすぐに戻る必要があるかわかりません。 –

+0

意図したとおりに動作する場合にのみ受け入れられます。動作しない場合は、それを小さな関数にリファクタリングしてみてください。もしそうなら、大きな問題は何ですか?より詳細なソースコードを見ることなく、私は特別な提案はできません。 – Flaise

+0

誰かがプラグを抜かない限り、 'finally'ブロックはどんな場合でも実行され、コードは期待どおりに動作します。しかし、すでに他の人が指摘しているように、あなたのコードを構造化する良い方法があります。 –

答えて

6

私は新しい方法にtryブロック内のコードをリファクタリングを示唆している:

data = CreateList(); 

... 

private List<X> CreateList() 
{ 
    List<X> list = new List<X>(); 
    // It's fine to return list from any point here... 
} 
+0

これは私が提案しようとしていたことです:私はいくつかのケースでは、可読性のために 'CreateList'ボディを他のメソッドの中に入れる方が良いでしょう。' Action'デリゲートを使うことができます。その匿名メソッドを終了します。 – hvd

+0

ありがとう、それは私が必要なものです。 – javapowered

2

何かが失敗した場合、最終的には(フェイルセーフメカニズムだと考える)のバックアップとして意図されているの使用を、あなたのメソッドの全体構造が間違っていて、リファクタリングすることができます。これらのリターンを得ることは、通常、別のアプローチを取ることを意味します(例えば、コメント内の誰かとしてスイッチを使用するなど) 。

+0

'switch'は私が必要としているものではありません。内部のコードには多くの分岐があり、ロジックが簡単ではないのでリファクタリングが難しい – javapowered

関連する問題