ただの感想文なんですけど。
ネタ元は雑記のほうにStreetw☆さんからいただいたコメントから(エントリの本文はあんまし関係ない予感w)。
ジェネリッククラスの中では、C#ではdefault(T)、VisualBasicではNothingを使うことで、その型の規定値が取得できる。
MSDNだと、ここらあたりになります。
MSDN:C# プログラミング ガイド ジェネリック コードの default キーワード (C# プログラミング ガイド)
MSDN:Visual Basic 言語リファレンス Nothing (Visual Basic)
ついでに
MSDN:C# 言語リファレンス null (C# リファレンス)
あくまで Visual Basic からの視点でしか見ていませんが、Visual Basic はなぜ「Nothing」というキーワードを選んだのか?ってのがちょっと気になりました。
ジェネリック コードの default キーワード (C# プログラミング ガイド) から引用しますと、
ジェネリック クラスとジェネリック メソッドでは、あらかじめ以下の情報を把握していない場合に、パラメータ化された型 T に既定値を割り当てる方法が 1 つの問題となります。
-
T が参照型か値型か
-
T が値型の場合、数値か構造体か
パラメータ化された型 T の変数がある場合、ステートメント t = null は、T が参照型のときにのみ有効です。また、t = 0 は、数値では機能しますが、構造体では機能しません。この問題を解決するには、default キーワードを使用します。
ふむふむ、C#のdefault キーワードはコンパイラさんがいろいろ考えて既定値を設定しますよ~ってことですか。
このdefault というキーワード、既定値を考えなければならないという意味では Nothing と同じですが、Nothing よりぐっと可読性があがると思うんです。これが Visual Basic に無いのが不思議だなぁって思ってる私はまだまだ Visual Basic の思想を感じ取れてないんでしょうか。
Visual Basic 言語リファレンス Nothing (Visual Basic) から引用しますと、
変数に Nothing を代入すると、変数の宣言された型に対する既定値が変数に設定されます。型に変数のメンバが含まれている場合は、すべてに既定値が設定されます。
変数が参照型である場合、つまりオブジェクト変数である場合は、Nothing を代入すると、どのオブジェクトとも関連付けられていない変数になります。
いや、今までもちゃんと知ってて書いているわけですが、改めて見ると違和感。「変数に Nothing を代入すると、変数の宣言された型に対する既定値が変数に設定されます。」だそうな。Nothing なのに。
ところで C# の default ってナニモノですか?w ジェネリック クラス やジェネリック メソッドじゃないと使えませんか?(試した感じだと使えそうなんですけど・・・。)
using System;
public static class Program
{
static void Main()
{
int defaultValue = default(int);
Console.WriteLine(defaultValue.ToString());
}
}
んでもって Visual Basic でもなんとかそれっぽくならんかなぁと思って思いつきで書いたのがこれ↓
Public NotInheritable Class [Default](Of T)
Private Sub New()
End Sub
Public Shared ReadOnly Property Value() As T
Get
Return Nothing
End Get
End Property
End Class
青い!すごく青い!!・・・でも、
とってもビミョー
ですよね。orz