私は同僚がコード内でいくつかの奇妙な動作をデバッグするのを手伝ってきました。次のサンプルはこれを示しています:finallyブロックがC#で動作しないのはなぜですか?
static void Main(string[] args)
{
string answer = Sample();
Console.WriteLine(answer);
}
public static string Sample()
{
string returnValue = "abc";
try
{
return returnValue;
}
catch (Exception)
{
throw;
}
finally
{
returnValue = "def";
}
}
このサンプルは何を返しますか?
finallyブロックのために "def"を返しますが、実際には "abc"を返します。コードを踏んで、finallyブロックが実際に呼び出されたことを確認しました。
本当の答えは、最初にこのようなコードを書くべきではないということですが、私はまだその動作について困惑しています。
編集:いくつかの回答に基づいてフローを明確にする。
コードをステップ実行すると、returnの前にfinallyが最後に実行されます。
重複:What really happens in a try { return x; } finally { x = null; } statement?
これは間違っています。return文がtryブロック内にある場合、finallyブロックが存在する場合は、制御が呼び出しメソッドに戻る前にfinallyブロックが実行されます。 – TStamper
TStamper - 変数がまだ "abc"の間にtryの戻り値が評価された場合、最終的に実行され、変数代入は変更されますが、既にキャッシュされたものは返されません。 – Chuck
trueですが、言い回しが間違っています。コードが何を述べているのかは、Sample関数で引き続き実行されません – TStamper