8

オブジェクトがヒープで作成されると、さらに2つのフィールドが追加されることを知っています。

  1. 同期ブロックインデックス
  2. タイプオブジェクトポインタ

では、タイプオブジェクトはいつヒープメモリに作成され、どのような種類のデータを保持するのでしょうか。タイプのメタデータのみを表しますか?

私はそれについて多くの詳細を見つけることができませんでした。

4

2 に答える 2

10

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 」というタイトルの記事があり、特にTypeFundamentalsMethodTableのセクションもあります。

于 2012-04-17T02:04:13.910 に答える
0

すべてのキャスト例外、型の一致および不一致は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();
于 2016-09-13T06:02:18.120 に答える