投稿数 - 437, コメント - 54263, トラックバック - 156

Intern pool

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

投稿日時 : 2007年1月18日 23:46

フィードバック

No comments posted yet.

コメントの投稿

タイトル
名前
URL
コメント