« [NEWS] 太陽の180億倍のブラックホール | トップページ | マイクロソフト ランゲージ ポータル 公開 »

2008年4月22日 (火)

[.NET] Nothing (VB) != null (C#)

かたまり わんくま どっと こむ。 にコメントしたネタなんだけど、 せっかくだからこっちにもメモ。

C/C++ 経験者にとっては、 VB の Nothing ってシロモノを null と同じものであると考えるのが自然でしょう。 それで普段は問題ないのです。 が…

Visual Basic 言語リファレンス - Nothing

変数に Nothing を代入すると、 変数の宣言された型に対する既定値が変数に設定されます。 型に変数のメンバが含まれている場合は、 すべてに既定値が設定されます。

変数が参照型である場合、 つまりオブジェクト変数である場合は、 Nothing を代入すると、 どのオブジェクトとも関連付けられていない変数になります。

Nothing が null と同じだと思っていると、 後半の話は OK なんですが。 前半に書いてあることはナニ、 ということになります。
これは、  値型にも Nothing を代入できる、 ということを意味します。 こんなふうに…

Dim i As Integer = Nothing
Call Assert.IsNotNull(i)
Call Assert.AreEqual(0, i)

構造体にもいけます。
わざとらしい構造体を作ってみます。 f(^^;

Public Structure MyStruct

    Public Str1 As String

    Private _s As String
    Public Property Str2() As String
        Get
            If (Me._s Is Nothing) Then
                Me._s = "Hello, NOTHING!"
            End If
            Return Me._s
        End Get
        Set(ByVal value As String)
            Me._s = value
        End Set
    End Property
End Structure

'* 構造体を new してみる
Dim st As MyStruct = New MyStruct()
Call Assert.IsNull(st.Str1)
Call Assert.AreEqual("Hello, NOTHING!", st.Str2)

'* 構造体のメンバとプロパティ(!) を使ってみる
st.Str1 = "123"
st.Str2 = "ABC"
Call Assert.AreEqual("123", st.Str1)
Call Assert.AreEqual("ABC", st.Str2)

'* 構造体変数に null を代入 !?
st = Nothing
Call Assert.IsNotNull(st)
Call Assert.IsNull(st.Str1)
Call Assert.AreEqual("Hello, NOTHING!", st.Str2)

ということで。
C/C++, Java, C# をバリバリやってる人には、 こういうコードを書いて困らせてあげましょう (w
# 嘘です。 むやみにやらないでくださいね。 f(^^;

あ。 たぶん、 Nothing は C# の null よりは default(T) のほうが近いんだと思います。

|

« [NEWS] 太陽の180億倍のブラックホール | トップページ | マイクロソフト ランゲージ ポータル 公開 »

プログラミング」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [.NET] Nothing (VB) != null (C#):

« [NEWS] 太陽の180億倍のブラックホール | トップページ | マイクロソフト ランゲージ ポータル 公開 »