c#で次のようなコード中のnumberフィールドは、どのメモリ領域に格納されるのでしょうか？

C#には静的メモリ領域はないのでしょうか  
または、それ以外の領域に格納されるのでしょうか

```

    Player player = new Player(); // インスタンス作成は可能
    
    Player.number = 3; // クラス変数へアクセス可能
    
    class Player
    {
        public static int number;
    }
    
```
CC BY-SA 4.0
2023-01-22T01:09:17.230
93496
2023-01-22T23:35:59.530
2023-01-22T11:32:37.350
56698
56698
question
c#
c#のStatic変数はどのメモリ領域に格納されますか？
C#には参照型と値型の2種類しか存在しません。またメモリ領域はGCが管理するヒープかスタックの2種類です。

  * 参照型のオブジェクトは全てヒープ上に存在し、GCによって管理されています。
  * 値型は状況によって異なります。多くの場合スタックに存在しますが、記述によってはヒープ上に存在し、GCによって管理されている場合もあります。

* * *

>
```

>     public static int number;
>  
```

ということですね。構文としては [宣言ステートメント（declaration
statements）](https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-
guide/statements-expressions-operators/statements#declaration-statements)
ですがその記述位置が重要です。今回のようにクラススコープの場合は[フィールド（field）](https://learn.microsoft.com/ja-
jp/dotnet/csharp/programming-guide/classes-and-structs/fields)になります。  
つまり今回の質問は静的フィールド（static
field）ということになります（[静的変数](https://learn.microsoft.com/ja-
jp/dotnet/csharp/language-reference/language-specification/variables#static-
variables)とも呼ぶようですので先の回答は訂正します）。

どこ格納されるかについては、大筋としては当初の通りです。静的フィールドの型が参照型であればヒープ上でGCに管理されます。今回の例では`int`つまり値型です。この場合、このクラスを含むDLLを読み込んだ際に同時に確保されたメモリ領域であり、スタックでもヒープでもありません。

* * *

C# /
.NETとしてはスタックとヒープという位置づけをしていますが、.NET自身は仮想環境であり、それを実現するホストプロセス、ネイティブ環境が存在します。  
ネイティブ環境にもスタックとヒープが存在しますが、.NETスタックも.NETヒープもネイティブヒープに配置されるはずです。  
この辺りは、.NET
Runtimeがどのようにメモリに読み込みネイティブコード生成しているかに関わってきて、かなり深い知識が必要になります。実際、私もよくわかっていません。

一般的には最初に説明したように、参照型・値型の違いを把握しておけば十分かと思われます。
CC BY-SA 4.0
2023-01-22T01:51:37.347
93497
2023-01-22T23:35:59.530
2023-01-22T23:35:59.530
4236
4236
93496
answer