MSDNフォーラムより
Class1 c1 = new Class1();
Class1 c2 = new Class1();
.NET で、普通の参照型を上記のように作成するとインスタンスは 2 つできる。
ところが、文字列に対して下記のようなコードを書いた場合、インスタンスは幾つできるだろうか?
string s1 = "abc";
string s2 = "abc";
string s3 = "abcd";
文字列は「intern pool」という特別なテーブル上に作成される。
全く同じ文字列ならば、新しいインスタンスが作られる事はない。このような仕組みになっているので、無駄にメモリを消費する事はないが、文字列の内容を変更する事はできない。以下のコードを見て欲しい。
string s4 = s1.Replace("a", "A");
s2 = "ABC";
このように、文字列の内容を変更しているように見えても、実際は何も変わっていない。単に次々新しいインスタンスを作成しているに過ぎないのだ。「何故 String は参照型なのに値型のような振る舞いをするのか」という疑問は、内部の仕組みを理解する事で氷解する。このような仕組みは特に目新しいものではなく、.NET に限った話でもない。例えば Python ではこの考えを数値型にまで広げている。
a = 10
b = 10
![](http://shuujin.wankuma.com/blog/20070118/Internpool_13DDC/python_thumb5.png)