投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/11/5 01:11:15
> この結果はStringクラスがEqualsメソッドをオーバーライドして
> おり、値の等価を調べていると理解できます。

そうですね。実際ヘルプ等にも、値比較のためにオーバーライドされていると記されています。
http://msdn.microsoft.com/ja-jp/library/system.string.equals.aspx


御存知かと思いますが、Equals の既定の実装が「参照型では参照の等価」「値型ではバイナリの一致性」
というだけであって、派生型においてはそれらがオーバーライドされる事があります。

たとえば、『値型』である Decimal 型では、1.10 と 1.1000 を別の内部形式で管理していますが、
それぞれを同じ値として扱えるよう、Equals がオーバーライドされています。
Dim a As Decimal = Decimal.Parse("1.10")
Dim b As Decimal = Decimal.Parse("1.1000")

Console.WriteLine("A={0}", a)                                      'A=1.10 
Console.WriteLine("B={0}", b)                                      'B=1.1000 
Console.WriteLine("ReferenceEquals : {0}", ReferenceEquals(a, b))  'ReferenceEquals : False 
Console.WriteLine("Equals : {0}", Equals(a, b))                    'Equals : True 
Console.WriteLine("= : {0}", a = b)                                '= : True 



また、『参照型』である IPAddress 型でも、アドレスが同じであれば、異なるインスタンスでも
同じ値として扱えるよう、Equals メソッドがオーバーライドされています。
Dim a As IPAddress = IPAddress.Parse("143.24.20.36")
Dim b As New IPAddress(New Byte() {143, 24, 20, 36})

Console.WriteLine("ReferenceEquals : {0}", ReferenceEquals(a, b))  'ReferenceEquals : False 
Console.WriteLine("Is 演算子 : {0}", a Is b)                       'Is 演算子 : False 
Console.WriteLine("Equals : {0}", Equals(a, b))                    'Equals : True 




> 皆さんの意見をお聞きしたいです。

特に意見と呼べるほどの物は持ち合わせていませんが、今回の件の関連情報ということで:
VB の「= 比較演算子」が、String.Equals とは異なる実装になっているという事も
蛇足程度には知っておくと良いかも知れません。