.NET 値の型とオブジェクトからの継承: 明確化
はじめに
C# の値の型 (構造体) は参照型とは大きく異なります。構造体はクラスから直接継承できませんが、すべて System.Object
から派生します。これは矛盾しているように見えます。この記事では、この継承の複雑さと、それを管理する CLR の役割について詳しく説明します。
誤解に対処する
構造体はクラスから継承できないという主張は、部分的には真実です。 構造体は継承を行いますが、間接的にのみ継承します。これらは System.ValueType
から継承し、さらに System.Object
も System.Object
から継承します。したがって、すべての構造体はこの仲介者を通じて
継承とコピー動作: 重要な違い
ValueType
Object
と
CLR メカニズム: ボックス化タイプとボックス化されていないタイプ
CLR は、ボックス化された型とボックス化されていない型を区別するメカニズムを使用して継承関係を管理します。 ボックス化は、値型をオブジェクトでラップすることによって参照型に変換します。 これにより、値の型をオブジェクトとして扱うことができます。 CLR は制約付き仮想呼び出しを採用し、型がボックス化されているかアンボックス化されているかに応じて、仮想メソッドの正しい呼び出しを保証します。
例え話
System.Object
ネストされたボックスを想像してください。参照型は青いボックス、値型は赤いボックスです。 System.ValueType
(O) は、周囲を取り囲む大きな青いボックスです。 System.Enum
(V) は O 内の青いボックスで、System.Object
(E) は V 内の別の青いボックスです。各赤いボックス (値の型) は V または E のいずれか内に存在し、どちらも最終的には O 内に含まれます。これは、どのようにするかを示しています。すべての値の型は
から継承します。 結論
System.Object
.NET の値型による System.Object
の継承は、CLR によるボックス化型およびボックス化されていない型の高度な処理の結果です。 これにより、値型は、独自のコピー動作を維持しながら、
以上が.NET で値の型はどのようにオブジェクトから継承されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。