.NET コンパクト フレームワークでメモリが割り当てられるのはいつですか? 値型と参照型に違いがある場合は、詳しく教えてください。確認するためのドキュメントまたは手順を歓迎します。
特に、このシナリオを検討してください...
private MyClass item; // here?
public void MyMethod()
{
item = new MyClass(); // or here?
}
.NET コンパクト フレームワークでメモリが割り当てられるのはいつですか? 値型と参照型に違いがある場合は、詳しく教えてください。確認するためのドキュメントまたは手順を歓迎します。
特に、このシナリオを検討してください...
private MyClass item; // here?
public void MyMethod()
{
item = new MyClass(); // or here?
}
メモリを割り当てる方法は 3 つあります。
静的:
これらはコンパイル時にバインドされ、割り当てられます。たとえば、グローバル静的変数。
スタック ダイナミック:
これらは実行時にバインドされ、スタックにプッシュされます。関数呼び出しのローカル変数など。
ヒープ動的:
現在、動的ヒープには、暗黙的および明示的など、いくつかの異なる「サブ カテゴリ」もありますが、その詳細については説明しません。
宣言すると
private MyClass item; // here?
MyClass への参照がスタックにプッシュされます。これは単なる参考であり、それ以上のものではありません。その時点での値は null です。
public void MyMethod()
{
item = new MyClass(); // or here?
}
その時点で、'new MyClass()' を呼び出すことによってメモリが明示的にヒープに割り当てられ、item がそれを参照します。
したがって、実際には、MyMethod を呼び出した後、2 つの変数があります。item という名前の参照型、および MyClass 型の item を参照するヒープ上の名前のない変数。
これはひっかけ問題のようなもので、思ったよりもずっと好きです。:)
基本から始めましょう。
変数を宣言しても、参照型に直接メモリ*が割り当てられるわけではありません。値の型は宣言の時点で初期化されるため、値の型に対してはそうします。参照型の場合、コンストラクターに入る時点でオブジェクトのストレージが割り当てられます。
*これが適用されないのはいつですか?
null
、オブジェクトを初期化すると、割り当てられたメモリに有効な参照が存在します。)詳細については、スタックとヒープの割り当てに関するC-Sharp Corner の記事を強くお勧めします。
CompactFrameworkのメモリ管理に関するMSDNWebケースを参照することを強くお勧めします。デスクトップでの動作とまったく同じではありません。このトークでは、GCヒープを理解するのに役立つ詳細とグラフィックを詳しく説明します。