オブジェクトがヒープで作成されると、さらに2つのフィールドが追加されることを知っています。
- 同期ブロックインデックス
- タイプオブジェクトポインタ
では、タイプオブジェクトはいつヒープメモリに作成され、どのような種類のデータを保持するのでしょうか。タイプのメタデータのみを表しますか?
私はそれについて多くの詳細を見つけることができませんでした。
オブジェクトがヒープで作成されると、さらに2つのフィールドが追加されることを知っています。
では、タイプオブジェクトはいつヒープメモリに作成され、どのような種類のデータを保持するのでしょうか。タイプのメタデータのみを表しますか?
私はそれについて多くの詳細を見つけることができませんでした。
Typeオブジェクトには、型の静的フィールドをバックアップするバイトと、型内で定義されたメソッドごとに1つのエントリを持つメソッドテーブルも含まれます。
メソッドが少なくとも1回実行されている場合、メソッドテーブルの各エントリはJITでコンパイルされたネイティブコードを指します。
型オブジェクトは、型が最初にインスタンス化されるとき、または静的型メンバーが最初に参照されるときに作成されます。
CLRの機能を深く理解したい場合は、Jeffrey Richterの本であるCLRをC#経由で購入することを強くお勧めします。第4章の「実行時の関係」というタイトルのセクションでは、ヒープでの.NETタイプの割り当てプロセスについて詳しく説明しています。
MSDNマガジンの2005年5月版には、「 JIT and Run:Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects 」というタイトルの記事があり、特にTypeFundamentalsとMethodTableのセクションもあります。
すべてのキャスト例外、型の一致および不一致はType Object
、.Netの助けを借りてCLRによって実行および処理されます。タイプを作成する最も簡単で最速の方法Type Object
は、typeof
以下に示すように演算子を使用することです。
var fileTypeObjectInHeap = typeof(File);
C#でこのようなことをしたことがある場合-オブジェクトのタイプをo
既知のタイプと比較します(ここFileInfo
):
var fileName = @"C:\sample.txt";
object o = new FileInfo(fileName);
if (o.GetType() == typeof(FileInfo)) { ... }
その後、あなたはType Object
無意識のうちにそのタイプを使用しました。
アプリケーションで使用されているすべてのタイプ(正確にはAppDomain)に対応して、Type Object
そのようなすべての目的で参照されるヒープ内の単一のインスタンスがあります。詳細と内部情報については、CLRからC#第4版を介してJeffreyRichterを引用しています。
Typeオブジェクトは、軽量オブジェクトである型参照を表します。型自体について詳しく知りたい場合は、型定義を表すTypeInfoオブジェクトを取得する必要があります。System.Reflection.IntrospectionExtensionsのGetTypeInfo拡張メソッドを呼び出すことにより、TypeオブジェクトをTypeInfoオブジェクトに変換できます。
Type typeReference = ...; // For example: o.GetType() or typeof(Object)
TypeInfo typeDefinition = typeReference.GetTypeInfo();