VBのNothingとC#のnullおよびdefault
VBの
Nothingは
C#の
nullに相当しますが、使い方が違う場面もあります。
たとえば、VBのNothingは変数の値に既定値を設定できますが、C#のnullにはそれができません。
既定値とはIntegerならば0、BooleanならばFalseといった値です。参照型の既定値は常にnull参照(VBではNothing, C#ではnull)です。 Nothingによる既定値の設定はIntegerのような基本的な型だけでなく、自作の構造体でも可能です。
VBのNothingで既定値を設定する
Dim i As Integer
i = 672
i = Nothing
MsgBox(i)
■リスト1:VBでNothingをつかって基本的な値型を既定値にする例Dim t As New Test With {
.Number = 627,
.Text = "Apple",
.Domain = AppDomain.CurrentDomain
}
MsgBox(t.ToString)
t = Nothing
MsgBox(t.ToString)
■リスト2:VBでNothingをつかって構造体を既定値にする例この例では次の構造体を想定しています。
Public Structure Test
Public Property Number As Integer
Public Property Text As String
Public Property Domain As AppDomain
Public Overrides Function ToString() As String
Return Me.Number.ToString & ", " & Me.Text & ", " & (Me.Domain Is Nothing).ToString
End Function
End Structure
■リスト3:上記の例で想定する構造体C#のdefaultで既定値を設定する
C#ではdefaultを使うと同様のことができます。
int i;
i = 672;
i = default(int);
MessageBox.Show(i.ToString());
■リスト4:C#でdefaultをつかって基本的な値型を既定値にする例Test t = new Test() {
Number = 627,
Text = "Apple",
Domain = AppDomain.CurrentDomain
};
MessageBox.Show(t.ToString());
t = default(Test);
MessageBox.Show(t.ToString());
■リスト5:C#でdefaultをつかって構造体を既定値にする例public struct Test
{
public int Number { get; set; }
public string Text { get; set; }
public AppDomain Domain { get; set; }
public override string ToString()
{
return this.Number.ToString() + ", " + this.Text + ", " + (this.Domain == null).ToString();
}
}
■リスト6:上記の例で想定する構造体ジェネリックでの活用
しかし、VBでもC#でもこのようにして既定値を設定する方法はあまり魅力的ではないように感じられるかもしれません。 基本的な値型は 0 のように値を直接代入すればよいですし、構造体は new すればよいからです。
この構文が威力を発揮するのはジェネリックのクラスやメソッドで、実体の型がなんだかよくわからないものに既定値を設定したいときです。
たとえば、全要素を初期化できるListを作ろうと思うと、次のように成ります。
Public Class ResetableList(Of T)
Inherits List(Of T)
Public Sub ResetAll()
For i As Integer = 0 To Me.Count - 1
Me(i) = Nothing
Next
End Sub
End Class
■リスト7:VB版 全要素初期化機能つきListpublic class ResetableList<T>:List<T>
{
public void ResetAll()
{
for (int i = 0; i < this.Count; i++)
{
this[i] = default(T);
}
}
}
■リスト8:C#版 全要素初期化機能つきListこれらの場合は値を直接書いたりNewを使うわけにはいきません。
ただ、参照型の既定値とはnull参照(VBではNothing、C#ではnull)のことですので、この例にはあまり実用性はないかもしれません。
参考