1

私は .NET での継承について混乱しています。その理由は次のとおりです。

私は以前、構造体が .NET のクラスから継承できないことを理解していたので、たとえば、次のコードはコンパイルされません。

struct MyStruct : MyClass
{

}

しかし今日、整数 (およびその他の値の型) はオブジェクトではなく構造体であり、ValueTypeクラスから継承されていることを読みました。ValueType クラスはSystem.Objectから継承します。その目的は、 System.Objectの特定のメソッドをオーバーライドして、これらのメソッドを値の型に適したものにすることです。

それで、取引は何ですか?構造体は .NET のクラスから継承できますか、できないか、または特定の状況でのみ継承できますか?

ありがとう

4

1 に答える 1

3

.net の内部では、特定のメンバーを含む構造体の定義は、同じフィールドとメンバーを持ち、.NET から継承するクラスの定義と同じSystem.ValueTypeです。classコンパイラは、を継承する a を宣言することを許可しませんが、 aをValueType宣言するstructと、コンパイラは「舞台裏で」継承するクラスを宣言することに注意してください。

.net で値型を特別なものにしているのは、ランタイムがストレージの場所 (変数、フィールド、パラメーターなど) を割り当てる方法です。継承していない型のストレージの場所ValueTypeが宣言されると、ランタイムはヒープ オブジェクトにスペースを割り当てます。参照。対照的に、継承元の型の格納場所ValueTypeが宣言されている場合、ランタイムはその型のすべてのパブリック フィールドとプライベート フィールドに領域を割り当てます。のような型の場合int、システムは、通常の型システムの外で、特別なプリミティブ型のプライベート フィールドを割り当てます。

値型の格納場所は、実際にはその型のインスタンスを保持していないことに注意してください。代わりにその型のインスタンスであり、その型のすべてのフィールドを保持します。like ステートメントは、 value-type instanceをstruct1 = struct2instance に置き換えません。代わりに、の対応するフィールドからすべてのフィールドをコピーします。同様に、値型の格納場所がキーワードを使用せずにメソッドとしてプロシージャに渡された場合、渡されるのは構造体インスタンス自体ではなく、そのフィールドの内容です。struct1struct2struct2struct1ref

値型の保存場所を派生していない型ValueType(Objectまたは などIComparable) の 1 つにコピーする必要がある場合、システムは値型の新しいヒープ オブジェクト インスタンスを作成し、すべてのフィールドを値型からその場所にコピーします。新しいインスタンスを作成し、その新しいインスタンスへの参照をターゲット ストレージの場所に格納します。このプロセスは「ボクシング」と呼ばれます。ほとんどのコンパイラはこれを暗黙的に行うため、値型の格納場所が から派生したオブジェクトを保持しているかのように動作しようとしますValueType。ただし、これは幻想であることに注意することが重要です。型Xが から派生しYX名前付きxxY名前付き がありyy、実行するxx = yy場合、そのようなステートメントはxxyy同じオブジェクト インスタンスを参照します。から派生したもののインスタンスを保持していても、xxyyが から派生した型ではない場合に発生します。ただし、and/orが から派生している場合は発生しません。その場合、システムはフィールドをあるインスタンスから別の (場合によっては新しい) インスタンスにコピーします。ValueTypeyyValueTypexxyyValueType

于 2012-06-11T16:58:45.730 に答える