tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルEqualsメソッドとIs演算子の違い
記事No5894
投稿日: 2007/07/23(Mon) 12:35
投稿者ダンボ
VB2005勉強中です。

If オブジェクト1.Equals(オブジェクト2) Then ...
If オブジェクト1 Is オブジェクト2 Then ...

この2つの文はまったく等価な動作になるのでしょうか?

そうだとしたらその使い分けは?(好みの問題?)

[ツリー表示へ]
タイトルRe: EqualsメソッドとIs演算子の違い
記事No5895
投稿日: 2007/07/23(Mon) 12:58
投稿者大吉末吉
> VB2005勉強中です。
>
> If オブジェクト1.Equals(オブジェクト2) Then ...
> If オブジェクト1 Is オブジェクト2 Then ...
>
> この2つの文はまったく等価な動作になるのでしょうか?

必ずしも、等価になる保証は無いと思います。


「Is演算子」は「同じインスタンスならTrue」ですが、
「Equalsメソッド」は、上記の加え、オブジェクトによっては、
「 2つのオブジェクトが同じインスタンスではなくても、同じ値を持つ場合に true」
となる場合もあります。


参考:
「Equals メソッドの実装」
http://msdn2.microsoft.com/ja-jp/library/336aedhh(VS.80).aspx)

[ツリー表示へ]
タイトルRe: EqualsメソッドとIs演算子の違い
記事No5896
投稿日: 2007/07/23(Mon) 13:25
投稿者よねKEN
#大吉末吉さんのコメントで十分とも思いますので、蛇足かもしれませんが

> If オブジェクト1 Is オブジェクト2 Then ...

は以下と等価ですね。
If Object.ReferenceEquals(オブジェクト1, オブジェクト2) Then

Equalsメソッドは値が等価かどうかを判定するためのメソッドで、
自分自身のクラスまたは基底クラスのいずれかでオーバーライドしていない場合は、
Object.Equalsの実装が使われるため、結果としてオブジェクトが同一かどうかのテストと
同じになることがあります。

Equalsメソッドの実装内容に関わらず、

> If オブジェクト1.Equals(オブジェクト2) Then ...
> If オブジェクト1 Is オブジェクト2 Then ...

上記の2文は、オブジェクト1がNothingの場合に異なりますね。

[ツリー表示へ]
タイトルRe^2: EqualsメソッドとIs演算子の違い
記事No5897
投稿日: 2007/07/23(Mon) 15:07
投稿者ダンボ
大吉末吉さん、よねKENさん、いつもお世話になっています。

違いが今ひとつピンときません。下記コードで検証してみたんですが
これだと EqualsメソッドとIs演算子の違いが見られませんでした。
ちょっと手直しすれば大吉末吉さん、よねKENさんの言葉が
具体化できると思うのですが、今のダンボには書けません(泣)


    Class TypeDefine
        Dim A As Integer
        Dim B As Long
    End Class

    Private Sub Main_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load

        Dim X As New TypeDefine
        Dim Y As New TypeDefine
        Dim Z As TypeDefine = X

        Debug.Print(X Is Y)        ' false
        Debug.Print(X Is Z)        ' true
        Debug.Print(X.Equals(Y))   ' false
        Debug.Print(X.Equals(Z))   ' true
        'Debug.Print(X.ReferenceEquals(Y))    'コンパイルエラー
        'Debug.Print(X.ReferenceEquals(Z))    'コンパイルエラー

[ツリー表示へ]
タイトルRe^3: EqualsメソッドとIs演算子の違い
記事No5898
投稿日: 2007/07/23(Mon) 15:28
投稿者よねKEN
> 違いが今ひとつピンときません。下記コードで検証してみたんですが
> これだと EqualsメソッドとIs演算子の違いが見られませんでした。

提示の例はTypeDefineクラスがEqualsメソッドをオーバーライドしていないので、
Objectクラスが持つEqualsメソッドの実装がそのまま使われます。
"結果としてたまたま"Is演算子を使った場合とEqualsメソッドを使った場合は
同一の挙動をします。

大吉末吉さんの提示されているリンク「Equals メソッドの実装」
にEqualsメソッドをオーバーライドしている例があるのでそれを参考に
オーバーライドして見てください。
XとYの比較でIsとEqualsでは異なる結果になります。

>         'Debug.Print(X.ReferenceEquals(Y))    'コンパイルエラー
>         'Debug.Print(X.ReferenceEquals(Z))    'コンパイルエラー

ReferenceEqualsはObjectクラスのSharedメソッドです。
>If Object.ReferenceEquals(オブジェクト1, オブジェクト2) Then
を再確認してください。

[ツリー表示へ]
タイトルRe^3: EqualsメソッドとIs演算子の違い
記事No5900
投稿日: 2007/07/23(Mon) 18:02
投稿者魔界の仮面弁士
> これだと EqualsメソッドとIs演算子の違いが見られませんでした。

Imports System.Net
Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        Dim X As IPAddress = IPAddress.Parse("192.168.0.1")
        Dim Y As IPAddress = IPAddress.Parse("192.168.0.1")
        Dim Z As IPAddress = X

        Debug.Print(X Is Y)                 ' False
        Debug.Print(X Is Z)                 ' True

        Debug.Print(X.Equals(Y))            ' True  ★
        Debug.Print(X.Equals(Z))            ' True

        Debug.Print(ReferenceEquals(X, Y))  ' False
        Debug.Print(ReferenceEquals(X, Z))  ' True
    End Sub
End Class

[ツリー表示へ]
タイトル[解決]EqualsメソッドとIs演算子の違い
記事No5922
投稿日: 2007/07/26(Thu) 11:38
投稿者ダンボ
魔界の仮面弁士 さんどうも有り難うございました。Equalsメソッドの有用性も分かりました。
大吉末吉さんの回答、よねKENさんのフォロー、魔界の仮面弁士さんの具体例を
通じて、やっと大吉末吉さんの回答で必要充分なことが理解できました。

#一般用掲示板での「Is演算子と=比較演算子」の話と同じことですね。
私はここが弱いのかしらん。

[ツリー表示へ]