C#のstringって値型?参照型?

C#のstringって値型?参照型?

結論

参照型です。

普段使われている方からするとちょっと意外な感じですよね。

実はstringは特殊な例で、値型のように振る舞う参照型なのです。

ちなみに、intなどの主要な値型は、構造体で定義されています。
一方でstringはクラスで定義されています。

値型か、参照型かを明確に分けているのは、
宣言したタイミングでメモリ領域を確保しているかどうかです。

bool型なら1バイト、int型(int32)なら4バイト確保されます。

一方でstring型は宣言したタイミングではメモリ領域確保されません。

以下のような定義があったとします。この時点ではメモリ領域は確保されていません。

string var1;
string var2;
string var3;

これを以下のようにしてみます。

var1 = “トマト”;
var2 = var1;
var3 = var2;

このようした場合、すべてに”トマト”という値が入っているように見えますが、
実際にはvar1が最初に”トマト”を代入した際にメモリ領域が確保され、
var2とvar3は同じものを参照しているのです。

ここで以下のように変更してみましょう。

var3 = “バナナ”;

参照型のイメージだと、var1もvar2も”バナナ”になりそうですが、ご存知の通り、そうはなりません。
これは、string型への文字列の代入参照先の値変更ではなく参照先ごと変更しているからです。

ブログカテゴリの最新記事