.NETには、参照型と値型の2つの型のカテゴリがあります。
構造体は値型であり、クラスは参照型です。
一般的な違いは、参照型はヒープ上に存在し、値型はインライン上に存在することです。つまり、変数またはフィールドが定義されている場所はどこでもです。
値型を含む変数には、値型の値全体が含まれます。構造体の場合、これは、変数に構造体全体とそのすべてのフィールドが含まれていることを意味します。
参照型を含む変数には、実際の値が存在するメモリ内の別の場所へのポインタまたは参照が含まれています。
これには、最初に1つの利点があります。
- 値型には常に値が含まれます
- 参照型にはnull参照を含めることができます。つまり、現時点では何も参照していません。
内部的には、参照型はポインターとして実装されており、それを知っていて、変数の代入がどのように機能するかを知っていると、他の動作パターンがあります。
- 値型変数の内容を別の変数にコピーし、内容全体を新しい変数にコピーして、2つを区別します。つまり、コピー後、一方を変更しても他方には影響しません。
- 参照型変数の内容を別の変数にコピーすると、参照がコピーされます。つまり、実際のデータの別の場所に同じものへの2つの参照があります。つまり、コピー後、一方の参照のデータを変更すると、もう一方の参照にも影響を与えるように見えますが、これは、両方の場所で同じデータを見ているだけだからです。
変数またはフィールドを宣言する場合、2つのタイプの違いは次のとおりです。
- 変数:値型はスタック上に存在し、参照型は実際のメモリが存在するヒープメモリ内のどこかへのポインタとしてスタック上に存在します
- class / struct-field:値型はクラス内に存在し、参照型は実際のメモリが存在するヒープメモリ内のどこかへのポインタとしてクラス内に存在します。
MSDNを参照してください。このチュートリアルは、円/点/軸の例に似ています。