掛けるメガネにもよります。「実装」メガネを使用している場合は、参照型の値にオブジェクト ヘッダーがあることがわかります。System.Object を継承します。オブジェクト ヘッダーには、ハッシュ コードなどのさまざまな情報を格納する同期ブロックと、Monitor.Enter() を呼び出したスレッド ID の 2 つのフィールドがあります。重要なフィールドは 2 番目のメソッド テーブル ポインターです。オブジェクトの種類を識別します。メソッド テーブルには、クラスのメソッドのアドレスが含まれています。これは常に、Object が実装するメソッドである Equals、GetHashCode、および ToString から始まります。
同じ眼鏡をかけていると、値型の値にはこのオブジェクト ヘッダーがありません。値を格納するために必要なスペースのみを占有します。bool には 1 バイト、Char には 2 バイト、int には 4 バイトなど。これにより、値型が非常に効率的になります。
2番目にかけられるメガネは「型式」メガネです。値型の値は、常にオブジェクトに変換できます。帰ってきた。この変換は、ボックス化変換と呼ばれます。戻ることをボックス化解除と呼びます。実装メガネをすばやくポップすると、これら 2 つのフィールドを持つオブジェクトが実際に取得されていることがわかります。メソッド テーブル ポインターは値の型を識別します。メソッド テーブルには、追加のメソッド ポインターがあります。IConvertible の場合と同様に、値型によって実装されるインターフェイスです。これらの 2 つのフィールドを超えるオブジェクトの残りの部分は、値型の値のビットで占められています。ボクシング変換前の単純な値だったときと同じビット。ボックス化されたオブジェクトは、すべての参照型オブジェクトと同様に、ガベージ コレクション ヒープに存在します。
ほとんどの場合、C# または VB.NET コンパイラはボックス化変換を完全に自動的に適用します。コードにキャストを自分で記述する必要はありません。たとえば、ToString または IConvertible メソッドの 1 つを呼び出すと、無料でボクシング変換を取得できます。
これにより、値型が System.Object から継承されているという錯覚が生じます。「型システム」メガネを着用している人は誰でも、値型が Object から完全に継承されていると主張するでしょう。「実装」メガネを着用している場合、ボクシングについて少し心配する傾向があります. 大幅に最適化されていますが、無料ではありません。変換を行うには CPU サイクルがかかり、ボックス化された値型の値はより多くのスペースを必要とし、ガベージを作成します。ジェネリック コレクション型が古い System.Collection クラスを完全に置き換えた理由の 1 つです。