人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【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
===========================================================


●質問者: llusall
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:AS nothing String [? にわか
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● KirakiraHikaru
●60ポイント

テスト結果

テスト?--------
[?-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...


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

◎質問者からの返答

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

満足です。

>Nothingの振る舞いの変更

参考になりました。

丁寧な回答でGOODです。


2 ● HiroCom777
●40ポイント ベストアンサー

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演算子を使わなければならない)という暗黙のルールがあると聞いたことがあります。

◎質問者からの返答

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

満足です。

>Nothingの振る舞いの変更

参考になりました。

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

そうですね。


3 ● takuchan_no2
●20ポイント

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

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

これを前提に置くと、

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

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

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

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

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

◎質問者からの返答

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

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

そうですね。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ