.NET における構造体とクラスの違いは何ですか?
ベストアンサー1
.NET には、参照型と値型という 2 つのカテゴリの型があります。
構造体は値型であり、クラスは参照型です。
一般的な違いは、参照型はヒープ上に存在し、値型はインライン、つまり変数またはフィールドが定義されている場所に存在することです。
値型を含む変数には、値型の値全体が含まれます。構造体の場合、変数にはすべてのフィールドを含む構造体全体が含まれることを意味します。
参照型を含む変数には、ポインター、つまり実際の値が存在するメモリ内の別の場所への参照が含まれます。
まず、これには 1 つの利点があります。
- 値型は常に値を含む
- 参照型にはnull参照を含めることができます。これは、現時点では何も参照していないことを意味します。
内部的には、参照型はポインターとして実装されており、そのことと変数の割り当ての仕組みがわかれば、他の動作パターンもわかります。
- 値型変数の内容を別の変数にコピーすると、内容全体が新しい変数にコピーされ、2つが別々になります。つまり、コピー後、一方に変更を加えても、もう一方には影響しません。
- 参照型変数の内容を別の変数にコピーすると、参照がコピーされ、実際のデータの同じ別の場所への参照が2つあることになります。言い換えれば、コピー後、1つの参照のデータを変更すると、他の参照にも影響するように見えますが、実際には両方の場所で同じデータを見ているだけです。
変数またはフィールドを宣言する場合、2 つの型の違いは次のとおりです。
- 変数:値型はスタック上に存在し、参照型は実際のメモリが存在するヒープメモリのどこかへのポインタとしてスタック上に存在します(ただし、Eric Lipperts の記事シリーズ: スタックは実装の詳細です。
- クラス/構造体フィールド:値型は完全に型内に存在しますが、参照型は実際のメモリが存在するヒープ メモリ内のどこかへのポインターとして型内に存在します。