5

このコードを持っていると、finally ブロックで変数を割り当てても、変数が常に割り当てられることを理解できない場合、その理由がわかりません。通貨が割り当てられない有効なオプションがないと思います。あなたが知っているなら、その理由を理解するのは素晴らしいことです. とても感謝しています!

ありがとう!

CurrencyVO currency;

try
{
     if (idConnection.HasValue && idConnection != 0)
     {
         currencyConnection = client.GetConnection(idConnection.Value);
         model.Connection = currencyConnection;
     }
     else 
     {
         int providerUserKey = (int)Models.UserModel.GetUser().ProviderUserKey;
         currencyConnection = client.GetConnection(providerUserKey);
     }                        
     currency = model.Currencies.SingleOrDefault(c => c.IdCountry == currencyConnection.idcountry) ?? new CurrencyVO();    
} 
catch
{
      currency = new CurrencyVO();                    
} 
finally
{
      model.PublishedContainer.Currency = currency;
}

エラーは最終ブロックで発生します。次のように最終ブロックから取り出すと:

                } catch {
                    currency = new CurrencyVO();
                }
                model.PublishedContainer.Currency = currency;

それは正常に動作します。

4

4 に答える 4

8

C# コンパイラが実行する明確な代入追跡は、必ずしも完全な分析を実行するとは限りません (一般的なケースでは不可能です)。コンパイラが実行する分析の複雑さを制限する規則があります。finallyここでブロックをカバーするルールは、http : //msdn.microsoft.com/en-us/library/aa691181.aspxで文書化されています。

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

try try-block finally 最終ブロック

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

したがって、特定の例でcurrencyは、ブロックの先頭にtry確実に割り当てられていないため、ブロックの先頭に確実に割り当てられていないと見なされますfinally

于 2011-12-21T23:55:48.483 に答える
1

ブロックnew CurrencyVO()で例外が発生した場合はどうなりますか? catchあはは!

于 2011-12-22T00:22:43.967 に答える
1

言語仕様にぶつかることなく、それを推論できます。ここでの失敗モードは、catch ブロック内のステートメントが例外をスローできることです。コンストラクターでの例外のスローは、C# でサポートされている可能性があります。ただし、一般に、どのステートメントでも例外がスローされる可能性があります。これにより、変数が初期化されません。finally ブロックの代入は常に実行されます。その場合は、初期化されていない変数を使用してください。

その場合に何が起こるかを考える必要があります。ただし、明らかな回避策は、変数を明示的に null に初期化することです。

于 2011-12-22T00:25:35.723 に答える
0

catch ブロック内に新しいCurrencyVOオブジェクトを作成しています。これは、エラー/例外がある場合にのみ実行されます。したがって、例外が発生しなければ、currency変数は割り当てられません。それがあなたがそれを使うことができない理由です。

編集: コードをコンパイルするために次の変更を行います。

CurrencyVO currency = null;

そして最後に:

if (currency != null)
   model.PublishedContainer.Currency = currency;

http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/a994a0ff-432b-4d23-b7d2-838b0b961de0

于 2011-12-21T23:47:13.130 に答える