結論
参照型です。
普段使われている方からするとちょっと意外な感じですよね。
実は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型への文字列の代入が参照先の値変更ではなく、参照先ごと変更しているからです。