4

検討、

        static void Main(string[] args)
        {
            Console.WriteLine(fun());
        }

        static int fun()
        {
            int i = 0;
            try
            {
                i = 1;
                return i;
            }
            catch (Exception ex)
            {
                i = 2;
                return i;
            }
            finally
            {
                i = 3;
            }
        }

サンプルコードは「1」を出力します。しかし、iの値はfinallyブロックで3に変更されます。'i'の値が3に変更されなかったのはなぜですか?

ありがとうございました、

4

5 に答える 5

12

このコードを考えてみてください-このコードは、あなたが考えていることと、実際に起こるべきだと思うことをどのように実現できるかを説明していると思います。

static void Main(string[] args)
{
    int counter = 0;
    Console.WriteLine(fun(ref counter)); // Prints 1
    Console.WriteLine(counter); // Prints 3
}        

static int fun(ref int counter)
{
  try
  {
      counter = 1;
      return counter;
  }
  finally
  {
      counter = 3;
  }
}

このコードを使用すると、メソッドから1を返しますが、カウンター変数を3に設定します。これは、メソッドの外部からアクセスできます。

于 2009-10-26T18:26:33.363 に答える
7

トライアンドキャッチで他のすべての後に最終的に実行されることを覚えておく必要があります。try / catch / finalステートメントの後にreturnステートメントを配置して、3を返すようにします。

于 2009-10-26T18:22:16.367 に答える
3

値型の代わりに参照型を使用すると、異なる動作が発生すると思います。

于 2009-10-26T18:46:45.240 に答える
2

「returni」と言った場合...C#はその戻り値を一時的な保持領域(メモリ)に入れてから、「finally」コードを実行します... finallyブロックがその値を変更できた場合、安全性が損なわれます/finallyブロックのファイナリズム。

これは、内部にリターンがあるusingステートメントのようなものです...リターン後(いわば)、「Dispose」は引き続き発生します。

于 2009-10-26T18:26:12.270 に答える
1

最後に常に実行されます

例外がスローされたかどうかに関係なく、コードは常にfinalで実行されます。したがって、コードは実際には次のようになります。

try
{
    i = 1;
}
catch
{
    i = 2;
}
finally
{
    i = 3;
}
return i;

しかし、この些細なケースでは、最終的にブロックはあまり意味がありません。それ以前に何が起こっても、常に3を返すからです。

最後に、リソースを解放するために使用されます

finallyブロックは通常、ブロック内に割り当てられたシステムリソースを解放する必要がある場合に使用する必要がありtryます(つまり、DB接続を開いて、ブロック内のデータを読み取り、tryで閉じますfinally)。したがって、例外があったかどうかに関係なく、常に解放されます。finallyこの場合、ブロックを使用することはあまり意味がありません。

于 2009-10-26T18:33:50.057 に答える