4

インターフェイスをインスタンス化できないことは知っていますが、それをオブジェクトに割り当てる場合、メモリがどのように割り当てられるかを誰かに説明してもらえますか。例:

ITest obj = (ITest) new TestClass1();  //TestClass1 is a class which implements ITest
obj.MethodsDefinedInInterface();

ITestは、TestClass1のプロパティとメソッドを保存するためにオブジェクトに変換しますか?

4

8 に答える 8

7

「割り当て」が何を意味するのか正確にはわかりません。次のステートメントは、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(スタック上)に配置されます。

于 2012-12-03T19:54:13.920 に答える
2

次のようになります。

TestClass1 test = new TestClass1();  
ITest obj = (ITest) test;
obj.MethodsDefinedInInterface();

これがあなたの質問に答えると思います。

于 2012-12-03T19:37:42.087 に答える
1

メモリは、他のオブジェクトと同様にインターフェイスを暗示するオブジェクトに割り当てられます。インターフェイスがオブジェクトの単なるプロパティであることを意味するかどうか

于 2012-12-03T19:37:08.920 に答える
1

メモリはTestClass1インスタンスにのみ割り当てられます。インターフェイスITestは、割り当てられたメモリを指す参照の一種にすぎません。

于 2012-12-03T19:37:13.440 に答える
1

ITestは、TestClass1のプロパティとメソッドを保存するためにオブジェクトに変換しますか?

ITestはタイプです。TestClass1のプロパティとメソッドはまだ存在しているだけで、obj変数を介してアクセスすることはできません。

于 2012-12-03T19:38:18.700 に答える
1

その非常に単純です。TestClass1に割り当ててから、それをインターフェイスにキャストし直します。インターフェイスをインスタンス化するのではなく、インターフェイスを実装するクラスをインスタンス化してから、具象クラスに(必須で)実装されるインターフェイスメソッドを呼び出すことに注意してください。

別の言い方をすると、次のようになります。

TestClass1 test = new TestClass1();
ITest obj = (ITest) test;
obj.MethodsDefinedInInterface();

割り当てられた領域はTestClass1用であることに注意してください。キャストのせいで伸び縮みしません!

于 2012-12-03T19:38:23.600 に答える
1

interfacesコンパイル時に、オブジェクトが技術的および論理的にセレイン基準を満たしていることを確認してください。

コードを実行してインターフェイスメモリを使用すると、クラスを使用してオブジェクトをインスタンス化する場合と同じように割り当てられます。

したがって、(メモリ割り当てに関して)違いはありません。

ITest obj = (ITest) new TestClass1();  //TestClass1 is a class which implements ITest
obj.MethodsDefinedInInterface();

TestClass1 obj = new TestClass1();  //TestClass1 is a class which implements ITest
obj.MethodsDefinedInInterface();
于 2012-12-03T19:38:40.017 に答える
1

したがって、最初に、このメソッドを入力すると、すべてのパラメーター(該当する場合)、戻り値(該当する場合)、およびそのメソッドのすべてのローカル変数のスタックにスペースが割り当てられます。ここで示したのは、割り当てる必要のあるローカル変数はですobjobjはインターフェイスであるため、単一の参照に十分なスペースが必要です(32ビットシステムでは32ビット、64ビットシステムでは64ビット)。他のローカル変数、戻り値、またはパラメーターがないため、スタック上でその1つの単語のみを取り上げます。

単一のオブジェクト(new TestClass1())を割り当てており、オブジェクトがクラスであると想定しているため(aのstruct命名はstruct TestClass1非常に意味があるため、ではありません)、の単一インスタンスを説明するのに十分なスペースがヒープに割り当てられますTestClass。そのスペースは、(アクセシビリティに関係なく)すべての単一フィールドに十分なスペースに加えて、オブジェクトのオーバーヘッドのために少し余分になります。この新しく割り当てられたオブジェクトへの参照は、ローカル変数に割り当てられたスタック上のスポットに配置されます。

これはすべて、実行時にプロセッサによって使用されるレジスタを無視します。コンパイラ、ジッター、オペレーティングシステム、プロセッサハードウェアなどの複雑な変換と最適化のために、私はそれが何をするかを予測しようと試みることができませんでした。幸いなことに、これらすべての抽象化のおかげで、私は本当に気にする必要はありません。

于 2012-12-03T19:59:13.800 に答える