「割り当て」が何を意味するのか正確にはわかりません。次のステートメントは、2つの別々の「割り当て」を行います。
TestClass1 test = new TestClass1();
最初はnew TestClass1()
、ヒープにsizeof(TestClass1)を割り当てるステートメントです。次に、ヒープ割り当てのアドレスの割り当てが変数test
に格納されます。この変数は、sizeof(object *)(つまり、IntPtr.Size、または実行中のハードウェア+ OS +ソフトウェアに基づく32/64ビット)としてスタックに割り当てられます。 。
次のステートメントは、「割り当て」でもまったく同じです。
ITest test = new TestClass1();
2つの違いは、変数で呼び出すことができるメソッドだけですtest
。
注:これは、インターフェースを実装する構造には当てはまりません。インターフェイスは参照型である必要がありますが、ご存知のように、構造体はそうではありません。これは.NETではボクシングと呼ばれ、最初に構造体のコピーをヒープに配置することで、構造体を参照型であるかのように参照できます。
そこで、ステートメントを再評価します。
TestSTRUCT1 test2 = new TestSTRUCT1();
これにより、スタックの名前付き変数にsizeof(TestSTRUCT1)が割り当てられますtest2
。(割り当ての影響がわからないnew TestSTRUCT1()
場合、追加のスタックコピーが作成される可能性がありますが、割り当ての直後に削除する必要があります。
次に、この値をインターフェイスに割り当てると、次のようになります。
ITest test3 = test2;
これで、さらに2つの割り当てが行われました。まず、構造がヒープにコピーされます。次に、そのヒープ常駐構造のアドレスが、新しく「割り当てられた」変数test3
(スタック上)に配置されます。