【VB2005】

初歩的な質問ですみません。
どれがイミディエイトウィンドウに表示されるかわかりますか?
①と②で結果が異なる理由を説明してください(必須)
また、実行せずにわかりましたか?

===========================================================
Debug.WriteLine("テスト①--------")
Dim textValue As String = Nothing
If textValue = Nothing Then
  Debug.WriteLine("[①-1] = Nothing") '①-1
End If
If textValue Is Nothing Then
  Debug.WriteLine("[①-2] Is Nothing") '①-2
End If
If textValue = "" Then
  Debug.WriteLine("[①-3] = """"") '①-3
End If

Debug.WriteLine("テスト②--------")
textValue = ""
If textValue = Nothing Then
  Debug.WriteLine("[②-1] = Nothing") '②-1
End If
If textValue Is Nothing Then
  Debug.WriteLine("[②-2] Is Nothing") '②-2
End If
If textValue = "" Then
  Debug.WriteLine("[②-3] = """"") '②-3
End If
===========================================================

回答の条件
  • 1人1回まで
  • 登録:2007/02/23 11:30:30
  • 終了:2007/02/26 15:06:43

ベストアンサー

id:HiroCom777 No.2

HiroCom777回答回数23ベストアンサー獲得回数22007/02/23 13:09:10

ポイント40pt

http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet30/vb6tonet30...

上が参考になると思います。

VB.Netでは、数値変数や文字列変数でもNothingが代入できる様になるようです。

上のページでは『Nothingキーワードは、何も参照が存在しないことを意味するキーワード』とあり、変数に代入すると参照は存在しないがその変数型の既定値(数値型なら0、文字列なら"")が返されます。

つまり、文字型に限るとNothingは参照が存在しないが参照されると""を返すと言うことです。

=演算子は2つが等しいかどうかを判定するため

Nothing = "" は真(True)となります。

これに対してIs 演算子は2 つのオブジェクト参照が同じオブジェクトを参照しているかどうか(今回の例の場合は、両者とも何も参照していないかどうか)を判定しています。

つまり、一度 textValue = "" と実行された変数は参照先があるので

Nothing = "" は偽(False)となります。

以上の様にNothingの振る舞いは理解しづらいので Nothingを=演算子で比較するコードは書くべきではない

(Is演算子を使わなければならない)という暗黙のルールがあると聞いたことがあります。

id:llusall

回答ありがとうございます。

満足です。

>Nothingの振る舞いの変更

参考になりました。

>Nothingを=演算子で比較するコードは書くべきではない

そうですね。

2007/02/26 15:01:02

その他の回答(2件)

id:KirakiraHikaru No.1

KirakiraHikaru回答回数354ベストアンサー獲得回数682007/02/23 12:11:15

ポイント60pt

テスト結果

テスト①--------
[①-1] = Nothing
[①-2] Is Nothing
[①-3] = ""
テスト②--------
[②-1] = Nothing
[②-3] = ""


理由

If textValue = Nothing Then

= を使用しているので""であるか評価される。(NothingがString型のデフォルト値""に変換される)


If textValue Is Nothing Then

Is を使用しているのでオブジェクトが割り当てられているかが評価される。


If textValue = "" Then

= を使用しているので""であるか評価される。


テスト①ではtextValueがNothingなので、

= 式の場合はString型のデフォルト値""に変換されるのでTrueになる。

Is 式の場合はオブジェクトが割り当てられていないのでTrueになる。


テスト②ではtextValueが""なので、

= 式の場合は""であるかが評価されるのでTrueになる。

Is 式の場合はオブジェクトが割り当てられているのでFalseになる。


@IT Nothingの振る舞いの変更

http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet30/vb6tonet30...


実行してみて予想と違ったので考えてみました。

id:llusall

回答ありがとうございます。

満足です。

>Nothingの振る舞いの変更

参考になりました。

丁寧な回答でGOODです。

2007/02/26 15:01:08
id:HiroCom777 No.2

HiroCom777回答回数23ベストアンサー獲得回数22007/02/23 13:09:10ここでベストアンサー

ポイント40pt

http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet30/vb6tonet30...

上が参考になると思います。

VB.Netでは、数値変数や文字列変数でもNothingが代入できる様になるようです。

上のページでは『Nothingキーワードは、何も参照が存在しないことを意味するキーワード』とあり、変数に代入すると参照は存在しないがその変数型の既定値(数値型なら0、文字列なら"")が返されます。

つまり、文字型に限るとNothingは参照が存在しないが参照されると""を返すと言うことです。

=演算子は2つが等しいかどうかを判定するため

Nothing = "" は真(True)となります。

これに対してIs 演算子は2 つのオブジェクト参照が同じオブジェクトを参照しているかどうか(今回の例の場合は、両者とも何も参照していないかどうか)を判定しています。

つまり、一度 textValue = "" と実行された変数は参照先があるので

Nothing = "" は偽(False)となります。

以上の様にNothingの振る舞いは理解しづらいので Nothingを=演算子で比較するコードは書くべきではない

(Is演算子を使わなければならない)という暗黙のルールがあると聞いたことがあります。

id:llusall

回答ありがとうございます。

満足です。

>Nothingの振る舞いの変更

参考になりました。

>Nothingを=演算子で比較するコードは書くべきではない

そうですね。

2007/02/26 15:01:02
id:takuchan_no2 No.3

takuchan_no2回答回数87ベストアンサー獲得回数32007/02/24 10:29:40

ポイント20pt

Nothingは「何も示していないこと」を示しています。

(別の言語だと、NULL、nilだったりしますが)

これを前提に置くと、

・①-1はその通りNothingかどうか判断していますので、Trueと判断されます。

・①-2はNothingと同じオブジェクトかどうか判断していますので、Trueと判断されます。(Is演算子は同じオブジェクトかを判断する演算子なので)

・①-3はString.Empty("")と比較しているわけですが、String.EmptyはString.EmptyであってNothingでは無いので、これはFalseと判断されます。

テスト②はこれと逆です。

String.EmptyとNothingはまったく違うものなので、混同しない方が良いです。

id:llusall

回答ありがとうございます。

>String.EmptyとNothingはまったく違うものなので、混同しない方が良いです。

そうですね。

2007/02/26 15:00:53
  • id:taknt
    Nothingと""は、違う扱いってことかな?



  • id:llusall
    そもそも「Nothing」と「空文字」は違います。
    「Is」で比較するのか「=」で比較するのかで・・・
    通常は・・・
    ・・・
    とコメント続けたいのですが、みなさまの回答を楽しみにしてみます。(当然、私は回答をしりません。)

  • id:HiroCom777
    ちょっと書き間違えました。

    下から4(?)行目

    Nothing = textValue は偽(False)となります。

    が正解ですね。
  • id:llusall
    みなさま、回答ありがとございました。
    気持ちの整理がつきました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません