DOBON.NET DOBON.NETプログラミング掲示板過去ログ

StringのNothingと""の違い?

環境/言語:[WinXPSP1、VB.NET ver2002 Standard、Framework1.1]
分類:[.NET]

お世話になっております。

他人のソースを読んでると、
場合によって
 If str = "" Then
 If str = Nothing Then
 If str.CompareTo("") = 0 Then
と使い分けてるのですが、
これらのコードにはどういった場合にどのような違いがあるのでしょうか?

ヘルプには、「変数にNothingを代入すると、その変数の型の既定値が設定される」とあるのですが、
例えば以下のソースで、
---
 Dim str As String
 str = ""
 If str = Nothing Then      'True
 End If
 If str.CompareTo("") = 0 Then  'True
 End If
 str = Nothing
 If str = "" Then         'True
 End If
 If str.CompareTo("") = 0 Then  'エラー
 End If
---
3つ目のIfが通り、4つ目のIfでエラーが出るのはなぜなのでしょうか。
1つ目のIfでNothing(Stringの規定値)が""なのかと思ったのですが、
それだと4つ目でエラーが起きる理由が分かりませんし・・・。
> 他人のソースを読んでると、
> 場合によって
>  If str = "" Then
>  If str = Nothing Then

これは
If str Is Nothing Then
ではなくですか? Nothingとの比較であればIs演算子を使用します。

「str = Nothing」で比較した場合は、便宜上のためか「str = ""」
と同じ結果になるようです。

#旧VBでは、
#If str = vbNullString Then という比較で、strが""のときTrueになったので
#旧VBの場合と同じ感覚で使用できるようにするための便宜かもしれません。

>  If str.CompareTo("") = 0 Then
> と使い分けてるのですが、
> これらのコードにはどういった場合にどのような違いがあるのでしょうか?

(1) If str = "" Then
(2) If str Is Nothing Then
(3) If str.CompareTo("") = 0 Then

便宜上、それぞれの方法に上記のように番号をつけます。

(1)は比較演算子=を使ってstrの参照する文字列の値と空文字列の値とを比較しています。
If str.Equals("") Then
と同じ意味になります。

# 普通のオブジェクトでは、「=」で比較しても値同士の比較になりませんが、
# String型はVB.NETで特別扱いされているので、
# If str = "" Then
# という形で従来のVBと同じように比較できます。

(2)は変数strにStringオブジェクトへの参照が設定されているかの判定しています。

(3)はIComparableインターフェースの持つ、CompareToメソッドを使用して、
strの文字列と空文字列を比較しています。

意味的には、「=」での比較と何ら変わらないと思います。

> ヘルプには、「変数にNothingを代入すると、その変数の型の既定値が設定される」とあるのですが、

Stringの既定値はNothingのはずです。(""ではありません)

>  If str.CompareTo("") = 0 Then  'エラー
>  End If

よって、strはNothingで、文字列インスタンスの参照を保持していないので、
インスタンスのメソッドであるCompareToを呼ぼうとすると
NullReferenceExceptionの例外が発生します。
返事が遅くなってしまいもうしわけありません。
返信ありがとうございます。

(1)If str = "" Then
(2)If str.CompareTo("") = 0 Then
(3)If str.Equals("") Then
(4)If str = Nothing Then

上記は全て長さ0の文字列か、の判定ということになるのでしょうかね。
意図した使い分けではなく、単に時間の経過かコード量かで統一しきれなかっただけなのでしょうか。
この中でも(4)は使わないほうがよさそうですね。
(str Is Nothingと混同しそうですので)
(2)もなんだか複雑にしてるだけな感じがするので、(1)か(3)に統一するといいかもしれないですね。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板