C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

参照型変数のNothing判定について

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■86464 / inTopicNo.1)  参照型変数のNothing判定について
  
□投稿者/ joto (1回)-(2018/01/31(Wed) 15:18:25)

分類:[VB.NET/VB2005 以降] 

2018/01/31(Wed) 15:18:52 編集(投稿者)

(VB2012使用)
前の担当(退職)が作成したプログラムを修正しようと思い、このコードを眺めていたら、
参照型変数がNothingでない場合の判定が、僕の書き方と異なっていました。
僕は、この場合(仮に参照型変数をobjとします)

If obj IsNot Nothing Then

と書きますが、このコードでは

If obj <> Nothing Then

と書かれていました。

おそらく、C#でいうところの(obj != null)のようなものと思っていますが、
このような書き方でもOKなのでしょうか?

この部分は今まで問題なく動いていたようですが、問題ないのかどうかが分かりません。

解説頂けると幸いです。
引用返信 編集キー/
■86467 / inTopicNo.2)  Re[1]: 参照型変数のNothing判定について
□投稿者/ shu (1086回)-(2018/01/31(Wed) 16:32:34)
No86464 (joto さん) に返信

以下のような処理を流した場合、処理が正しく行われます。
ただしそれはOperator =,<>のペアをクラス内で定義しているからです。
定義されていないクラスに対し=,<>演算を行うとエラーとなります。
参照型のNothing判定をする場合、Is,IsNot演算子を使いましょう。

        Dim obj As Class1

        obj = New Class1 With {.a = "1"}
        If obj <> Nothing Then Console.WriteLine($"obj={obj}はnothingではありません。")

Public Class Class1
    Public Property a As String

    Public Shared Operator =(itm1 As Class1, itm2 As Class1)
        If itm1 Is Nothing AndAlso itm2 Is Nothing Then
            Return True
        Else
            Return (itm1 Is itm2)
        End If
    End Operator

    Public Shared Operator <>(itm1 As Class1, itm2 As Class1)
        Return Not (itm1 = itm2)
    End Operator

    Public Overrides Function ToString() As String
        Return a.ToString
    End Function
End Class

引用返信 編集キー/
■86468 / inTopicNo.3)  Re[2]: 参照型変数のNothing判定について
□投稿者/ joto (2回)-(2018/01/31(Wed) 16:46:09)
No86467 (shu さん) に返信
> ■No86464 (joto さん) に返信
>
> 以下のような処理を流した場合、処理が正しく行われます。
> ただしそれはOperator =,<>のペアをクラス内で定義しているからです。
> 定義されていないクラスに対し=,<>演算を行うとエラーとなります。
> 参照型のNothing判定をする場合、Is,IsNot演算子を使いましょう。

なるほど、たまたまそのクラスではOperatorに<>等が定義されていたからなのですね。
参照型のNothing判定をする場合、やはりIs,IsNot演算子を使うべきなのですね。
ありがとうございました。スッキリです。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ