投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/11/4 20:27:04
> is演算子は参照の等価を調べるはずです。
その通りです。ReferenceEquals メソッドの動作ですね。


> なのに例1では値の等価を調べているように思われます。
ここには、String 型であるが故の注意点があります。


まず、String 型とは値が固定的であり、通常、その値は変更できないことになっています。例えば、
  Dim x As String = "abc"
  x = "def"
という処理は、一つの文字列インスタンスの値を abc → def に書き換えているのではなく、
abc というインスタンスを捨てて、def という別のインスタンスを割り当てる事を意味します。

この「内容が変化しない」という特性ゆえ、これらのインスタンスが同一であろうとなかろうと、
利用側には影響が少ないため、まるで値型と同じように振る舞えるようになっています。この特性を活かし
リテラル文字列については、同じ文字列参照を流用することでメモリ使用量を抑えるようになっています。
(この仕組みを、文字列インターン プールと言います)
http://msdn.microsoft.com/ja-jp/library/system.string.intern.aspx
http://msdn.microsoft.com/ja-jp/library/system.reflection.emit.opcodes.ldstr.aspx


ただし、同じ内容が常に同一インスタンスになるわけではありません。今回のようなパターンや
「New String( Char配列 )」で生成された場合などでは、それぞれユニークなインスタンスを返します。