1. ホーム
  2. c#

[解決済み] static」値が関数呼び出し後にリセットされるように見える [重複].

2023-04-07 16:30:19

質問

静電気に関する記事がたくさんありました( MSDN , MSDN 2 , スタック オーバーフロー などなど)、しかし、なぜこのコードで -1 :

class Program
{
    static int value = 0;

    static int foo()
    {
        value = value - 7;
        return 1;
    }

    static void Main(string[] args)
    {
        value -= foo();
        Console.WriteLine(value);
        Console.ReadKey();
    }
}

の後にデバッガが表示する内容は以下の通りです。 foo() が実行された後、その結果が value :

しかし、一歩遅れて value-1 :

私は -8 というのは、メモリに一度だけ保存される静的フィールドのためです。

に変更したところ

var x = foo();
value -= x;

を表示します。 -8

これは具体的にどのように動作するのでしょうか?

どのように解決するのですか?

この問題は、静的なことではなく、引き算の仕組みの問題です。

value -= foo(); は、次のように展開できます。 value = value - foo()

コンパイラはこれを4つのステップに分けて説明します。

  1. の値を読み込む。 value の値をスタックにロードする。
  2. メソッドを呼び出す foo を呼び出し、その結果をスタックに載せる。
  3. スタック上のこれら2つの値で引き算を行う。
  4. 結果を value フィールドに戻します。

ということで、元の値である value フィールドはすでに読み込まれています。何を変更しても value メソッドで foo を指定した場合、引き算の結果は影響を受けません。

に変更した場合、順序は value = - foo() + value に変更した場合、その値は value フィールドの値は foo が呼ばれた後に読み込まれます。その結果 -8 で、これが期待されるものです。

Eliahuさんのコメントありがとうございます。