.NET ヒープとスタック
これは、スタックとヒープがどのように機能するかを徹底的に扱います。
C# およびその他の多くのヒープを使用する OOP 言語の一般的な参照語の使用このコンテキストでは、参照用のポインターではなくハンドルを使用します (C# はポインターを使用することもできます!)これ。このトピックに関する Eric Lippert の優れた投稿を参照してください。ハンドルはアドレスではありません
Handle がポインターのサイズであると言うのは適切ではありません。(たまたま同じかもしれませんが) ハンドルはオブジェクトのエイリアスであり、オブジェクトへの正式なアドレスである必要はありません。
この場合、CLR はたまたまハンドルに実際のアドレスを使用します: 上記のリンクから:
...CLR は、ガベージ コレクターが所有するオブジェクトへのアドレスとしてマネージド オブジェクト参照を実際に実装しますが、それは実装の詳細です。
したがって、ハンドルはおそらく 32 ビット アーキテクチャでは 4 バイト、64 バイト アーキテクチャでは 8 バイトですが、これは「確かに」ではなく、ポインタが直接の原因ではありません。コンパイラの実装と使用されるアドレス範囲によっては、ポインタの種類によってサイズが異なる場合があることに注意してください。
このすべてのコンテキストを使用して、おそらくポインタの類推によってこれをモデル化できますが、ハンドルがアドレスである必要はないことを理解することが重要です。CLR は、将来必要に応じてこれを変更することを選択でき、CLR の消費者はそれ以上のことを知る必要はありません。
この微妙なポイントの最終的なドライブ:
これは C# ポインターです。
int* myVariable;
これは C# ハンドルです。
object myVariable;
それらは同じではありません。
ハンドルでは行うべきではない、ポインターでの数学のようなことを行うことができます。ハンドルがたまたまポインターのように実装されていて、それをポインターのように使用している場合、ハンドルを何らかの方法で誤用しているため、後で問題が発生する可能性があります。