6
string foo;
try
{
    foo = "test"; // yeah, i know ...
}
catch // yeah, i know this one too :)
{
    foo = null;
}
finally
{
    Console.WriteLine(foo); // argh ... @#!
}
Console.WriteLine(foo); // but nothing to complain about here

それに加えて、BP (キャッチ ルーティング) ではありませんが、これは私が得ることができる最高の分離です。
しかし、「危険、危険 - 初期化されていない可能性があります」という素晴らしい波が表示されます。どうして?

編集:「「宣言」に
単に置く」ことを提案しないでください。string foo = string.Empty;宣言したいのですが、時間内に課題を終わらせてください!

4

6 に答える 6

3

C# 仕様 (5.3.3.14) からの背景:

次の形式の try ステートメント stmt の場合:

try-block を試してみてください

(...)

finally-block の先頭での v の明確な代入状態は、stmt の先頭での v の明確な代入状態と同じです。

Try-Catch-Finally(5.3.3.15) を編集します。

try-catch-finally ステートメント (...) の明確な代入分析は、ステートメントが try-catch ステートメントを囲む try-finally ステートメントであるかのように行われます。

次の例は、try ステートメント (§8.10) のさまざまなブロックが明確な代入にどのように影響するかを示しています。

class A
{
  static void F() 
  {
    int i, j;
    try {
      goto LABEL;
      // neither i nor j definitely assigned
      i = 1;
      // i definitely assigned
    }
    catch {
      // neither i nor j definitely assigned
      i = 3;
      // i definitely assigned
    }
    finally {
      // neither i nor j definitely assigned
      j = 5;
      // j definitely assigned
    }
    // i and j definitely assigned
    LABEL:;
    // j definitely assigned
  }
}

問題をよりよく示す例を考えました:

int i;
try
{
    i = int.Parse("a");
}
catch
{
    i = int.Parse("b");
}
finally
{
   Console.Write(i);
}
于 2012-05-24T07:13:56.863 に答える
2

おそらく問題は、 と の両方が例外trycatchスローする場合があることだと思います。その場合、finallyに到達する必要がありますが、 は初期化されていませんfoo。その場合、コードの残りの部分には到達しないため (catchブロックでスローされた例外により、 の後のメソッドから抜け出しますfinally)、これは の後のコードには問題になりませんfinallytryまたはcatchブロックのいずれかが実行された場合にのみ、そのコードに到達できます。

すべての割り当てがfoo例外をスローする場合が常にあり、その場合でもfinallyブロックは常に実行されるため、初期化されていない可能性が常にありfooます。

私が知る限り、これを回避する唯一の方法は、 の初期化値を提供することですfoo

于 2012-05-24T07:37:45.007 に答える
2

必要に応じて、最初の行を変更する string foo = nullか初期化する必要があります。コンパイラに関する限り、foo が try ブロックで初期化される前に例外が発生する可能性があり、catch も発生しない可能性があります。

于 2012-05-24T07:05:03.700 に答える
0

string fooクラスレベルで問題を解決することを宣言します

編集:または

string foo = "default";
try
{
    foo = "test"; 
}
catch (Exception) 
{
    foo = null;
}
finally
{
    Console.WriteLine(foo); 
}
于 2012-05-24T07:20:52.053 に答える
-2

試す

string foo = string.Empty;
于 2012-05-24T07:04:28.757 に答える
-2

これを試してください:

string foo = null;
try
{
    foo = "test"; // yeah, i know ...
}
catch // yeah, i know this one too :)
{
}
finally
{
    Console.WriteLine(foo); // argh ... @#!
}
Console.WriteLine(foo); // but nothing to complain about here
于 2012-05-24T07:05:22.220 に答える