2017-04-03 5 views
0

try/catch/finallyで変数を宣言して使用するためのベストプラクティス/推奨事項は何ですか?tryブロック内またはtryブロック外に変数を宣言する必要はありますか?

私たちはtryブロックの外側に変数を宣言し、最後に処分する必要がありますか? tryブロック内で宣言して自動的に破棄しますか?これは、変数の型があるに依存

string Name = String.Empty; 
try 
{ 
    //do work 
} 
catch 
{ 
    //safely access s 
    Console.WriteLine(Name); 
} 

OR 

string Name; 
try 
{ 
    //do work 
} 
catch 
{ 
    if (!String.IsNullOrEmpty(Name)) 
    { 
     //safely access s 
     Console.WriteLine(Name); 
    } 
} 
+3

それはどのような変数とどのような仕事に完全に依存し... – TheLethalCoder

+4

は、なぜあなたは変数が '...試すcatch'ブロックによって自動的に配置されることを期待します? –

+5

2番目の例は、 'Name'がcatchブロックで読み込まれる前に確実に割り当てられていないため、コンパイルされません。それは別として、可能な限り小さな変数を変数に与えるべきです。 – Lee

答えて

0

、接続、DataReaderオブジェクト、ファイルストリームハンドルのような任意のCOMコンポーネントであり、あなたが試してみるの外でそれらを宣言する必要があるオブジェクトを手動で閉じることが必要だと思います場合最終的にそれらを処分する。

あなたが言及したような通常のタイプの変数を持っている場合、それは自動的に破棄され、それらを破棄する必要はありません。

COMコンポーネントを破棄する方法は、このように使用することです。

using(var test = new Object()) 
{//Do Coding here 
} 
1

これは、必要な範囲と変数で何をしたいかによって異なります。 tryブロック内に宣言すると、block以外の変数を使用することはできません。catchブロック内であっても変数を使用することはできません。これは、catchが例外的な状況を処理しなければならず、finallyが常に実行可能でなければならないという事実と関係がある。 tryスコープ内に変数を宣言すると、例外がスローされたときに変数が初期化されているかどうかわかりません。 try/catchブロックの後に変数が初期化されるかどうかは決してわかりません。したがって、コード内のcatch/finallyまたはlaterの中で変数を使用する場合は、より安全でより前に宣言することができます(finallyブロック内の処理を常に処理できることが確実です)。しかし、常に変数に可能な限り小さな範囲を与えるようにしてください。だから、あなたがtryの範囲外にそれを必要としないと確信すれば、tryの中にそれを宣言してください。

私が何を意味するのかの例:

try 
{ 
    throw new SomeException("It goes wrong here"); 
    string iNeedThisVariable = "but i never get initialized"; 
} 
catch (SomeException e) 
{ 
    Console.Out.WriteLine(iNeedThisVariable); //This goes wrong, since you need to show the string, but it has never been initialized 
} 
finally 
{ 
    Console.Out.WriteLine(iNeedThisVariable); //Also can't use it here! 
} 
関連する問題