[.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) のほうが近いんだと思います。
| 固定リンク
「プログラミング」カテゴリの記事
- 【.NET / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【.NET Core】 プロジェクトを作ると 「project.assets.json が見つかりません」 エラー(2018.02.10)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
この記事へのコメントは終了しました。
コメント