1. ホーム
  2. .net

[解決済み] .NETにおけるstructとclassの違いは何ですか?

2022-03-19 14:34:14

質問

.NETの構造体とクラスの違いは何ですか?

どのように解決するのですか?

.NETでは、型は2つのカテゴリに分類されます。 参照型 値型 .

構造体は 値型 であり、クラスは 参照型 .

一般的な違いは 参照型 はヒープ上に存在し 値型 はインラインに、つまり変数やフィールドが定義されている場所に存在します。

を含む変数は 値型 には、全体の 値型 の値を指定します。構造体の場合は、構造体全体とそのすべてのフィールドが変数に含まれることを意味します。

を含む変数は 参照型 はポインタを含むか 参照 実際の値が存在するメモリ上のどこか他の場所への移動です。

これには、そもそも1つのメリットがあります。

  • 値の種類 常に値を含む
  • 参照型 を含むことができます。 ヌル -つまり、その時点では何も参照していないことを意味します。

内部的には 参照型 はポインタとして実装されており、そのことと、変数の割り当ての仕組みを知っていれば、他の動作パターンがあることがわかります。

  • の内容をコピーして 値型 変数の内容を別の変数にコピーすると、その内容全体が新しい変数にコピーされ、2つの変数が区別できるようになります。言い換えれば、コピー後は一方を変更しても他方には影響しません。
  • の内容をコピーして 参照型 変数を別の変数にコピーすると、参照もコピーされます。 どこか を保存しています。つまり、コピーした後、一方の参照のデータを変更すると、もう一方の参照にも影響を与えるように見えますが、実際には同じデータを2箇所で見ているだけなのです。

変数やフィールドを宣言するとき、この2つのタイプはどのように違うのでしょうか。

  • 変数を指定します。 値の種類 はスタックに住んでいます。 参照型 は、実際のメモリが存在するヒープメモリのどこかへのポインタとしてスタック上に存在します(ただし Eric Lippertsの記事シリーズ。スタックは実装の詳細である .)
  • class/struct-fieldになります。 値型 は完全に型の中に住んでいます。 参照型 は、実際のメモリが存在するヒープメモリのどこかへのポインタとして、型の内部に存在します。