現在ログインしていません。
新規アカウント作成
ログイン

VBのNothingとC#のnullおよびdefault

VBNothingC#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版 全要素初期化機能つきList

public 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)のことですので、この例にはあまり実用性はないかもしれません。

参考