[解決済み] 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つのステップに分けて説明します。
-
の値を読み込む。
value
の値をスタックにロードする。 -
メソッドを呼び出す
foo
を呼び出し、その結果をスタックに載せる。 - スタック上のこれら2つの値で引き算を行う。
-
結果を
value
フィールドに戻します。
ということで、元の値である
value
フィールドはすでに読み込まれています。何を変更しても
value
メソッドで
foo
を指定した場合、引き算の結果は影響を受けません。
に変更した場合、順序は
value = - foo() + value
に変更した場合、その値は
value
フィールドの値は
foo
が呼ばれた後に読み込まれます。その結果
-8
で、これが期待されるものです。
Eliahuさんのコメントありがとうございます。
関連
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015