構造体はC#のクラスから派生できますか?
そうでない場合、intなどのプリミティブデータ型をクラスから派生させることができるのはなぜobject
ですか?データ型intは基本的に構造体型(値型)であるため。
これはルールの単なる例外ですか?
.Equals()
整数およびその他の値型(boolなど)は、継承を利用できるため(つまり、共通の.GetType()
、、.ToString()
関数 にアクセスできるため)、オブジェクトです。
これは、.NETFrameworkでの設計上の決定です。System.ValueTypeの下にあるすべての値型に対して個別の関数を記述するのではなく、共通のコードベースを使用します。
すべての構造体はを継承System.ValueType
し、次に継承しObject
ます。
それを変更することはできません。
ランタイムが型に格納場所を割り当てるとき、または型を操作するためのコードを生成するとき、型がそれ自体System.ValueType
ではなく派生しているかどうかをチェックしSystem.ValueType
ます。保存場所がこれらの基準を満たさない限り、ヒープオブジェクト参照を保持し、そのメンバー(フィールド、メソッド、プロパティなど)を操作するコードは参照されたオブジェクトに作用します。それ以外の場合、保存場所はそのタイプのすべてのパブリックフィールドとプライベートフィールド(そのタイプのすべての保存場所に同じように配置されます)を保持し、そのメンバーを操作するコードはすべて保存場所自体を操作します。
値型をクラスの格納場所ValueType
、またはから派生していない格納場所に格納しようとValueType
すると、システムは格納場所の型の新しいヒープオブジェクトを生成し、そのオブジェクトへの参照をに格納します。適切な保管場所。から派生するタイプの格納場所System.ValueType
、およびそれらにアクセスするためのコードは、ランタイムによって特別に処理されますが、から継承するヒープオブジェクトインスタンス(上記の新しく作成されたインスタンスなど)は、System.ValueType
から派生するヒープオブジェクトです。System.ValueType
継承動作は基本的に他のタイプと同じであるため、ヒープ参照を処理することを期待するコードによって渡される可能性があります。
のようなステートメントには、Object Foo = New System.Drawing.Point(3,4);
実際には次の3種類が含まれます。
これらすべての結果として、値型はからValueType
継承するものとして定義できObject
、型がから継承するヒープオブジェクトValueType
は継承しますが、値型の格納場所はからObject
継承するものを保持しませんObject
。
クラス階層は次のように機能します(簡略化)。
Object-> ValueType-> int Object-> ValueType-> struct
c#の定義による構造体は、継承を許可しません。
これは、C#言語内でのstuctsの役割を説明する素晴らしい記事です。
http://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx