8

構造体はC#のクラスから派生できますか?

そうでない場合、intなどのプリミティブデータ型をクラスから派生させることができるのはなぜobjectですか?データ型intは基本的に構造体型(値型)であるため。

これはルールの単なる例外ですか?

4

4 に答える 4

9

.Equals()整数およびその他の値型(boolなど)は、継承を利用できるため(つまり、共通の.GetType()、、.ToString()関数 にアクセスできるため)、オブジェクトです。

これは、.NETFrameworkでの設計上の決定です。System.ValueTypeの下にあるすべての値型に対して個別の関数を記述するのではなく、共通のコードベースを使用します。

タイプに関するMicrosofのドキュメント

于 2012-12-04T17:14:42.847 に答える
6

すべての構造体はを継承System.ValueTypeし、次に継承しObjectます。

それを変更することはできません。

于 2012-12-04T17:06:22.157 に答える
1

ランタイムが型に格納場所を割り当てるとき、または型を操作するためのコードを生成するとき、型がそれ自体System.ValueTypeではなく派生しているかどうかをチェックしSystem.ValueTypeます。保存場所がこれらの基準を満たさない限り、ヒープオブジェクト参照を保持し、そのメンバー(フィールド、メソッド、プロパティなど)を操作するコードは参照されたオブジェクトに作用します。それ以外の場合、保存場所はそのタイプのすべてのパブリックフィールドとプライベートフィールド(そのタイプのすべての保存場所に同じように配置されます)を保持し、そのメンバーを操作するコードはすべて保存場所自体を操作します。

値型をクラスの格納場所ValueType、またはから派生していない格納場所に格納しようとValueTypeすると、システムは格納場所の型の新しいヒープオブジェクトを生成し、そのオブジェクトへの参照をに格納します。適切な保管場所。から派生するタイプの格納場所System.ValueType、およびそれらにアクセスするためのコードは、ランタイムによって特別に処理されますが、から継承するヒープオブジェクトインスタンス(上記の新しく作成されたインスタンスなど)は、System.ValueTypeから派生するヒープオブジェクトです。System.ValueType継承動作は基本的に他のタイプと同じであるため、ヒープ参照を処理することを期待するコードによって渡される可能性があります。

のようなステートメントには、Object Foo = New System.Drawing.Point(3,4);実際には次の3種類が含まれます。

  1. タイプ`System.Drawing.Point(3,4)`の名前のない一時的な保存場所で、そのタイプ(2つの整数)のプライベートフィールドを保持し、(3,4)に初期化されます。この保存場所には`Object`が含まれていないことに注意してください。コンパイラがそのフィールドを表すことを知っている2つの整数を保持します。
  2. タイプ`System.Drawing.Point`のヒープオブジェクト。これはヒープオブジェクトであるため、すべてのヒープオブジェクトと同様に、`System.Object`から継承します。
  3. 変数名`Foo`で表されるタイプ`Object`の保管場所。

これらすべての結果として、値型はからValueType継承するものとして定義できObject、型がから継承するヒープオブジェクトValueTypeは継承しますが、値型の格納場所はからObject継承するものを保持しませんObject

于 2012-12-04T18:59:23.437 に答える
0

クラス階層は次のように機能します(簡略化)。

Object-> ValueType-> int Object-> ValueType-> struct

c#の定義による構造体は、継承を許可しません。

これは、C#言語内でのstuctsの役割を説明する素晴らしい記事です。

http://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx

于 2012-12-04T17:15:23.397 に答える