いくつかのコードがデフォルト値を返すのを見たので、ユーザー定義のクラスについて知りたいのですが、コンパイラはそのデフォルト値をどのように定義するのでしょうか?
10 に答える
残りは になりますnull
が、次を使用して、任意の型のデフォルト値を取得できることも付け加えておきます。default
default(MyClass) // null
default(int) // 0
これは、ジェネリックを扱う場合に特に役立ちます。default(T)
戻り値の型がT
であり、それが nullable であると想定したくない場合は、 returnを使用することをお勧めします。
のデフォルト値class
はnull
注: ADefaultValueAttribute
によって、メンバーが属性の値で自動的に初期化されることはありません。コードで初期値を設定する必要があります。
でプロパティを装飾できますDefaultValueAttribute
。
private bool myVal = false;
[DefaultValue(false)]
public bool MyProperty
{
get
{
return myVal;
}
set
{
myVal = value;
}
}
これがあなたの質問に答えていないことはわかっています。これを関連情報として追加したかっただけです。
詳細については、http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx を参照してください。
次のように、この「デフォルト」クラス インスタンスをプロパティではなくフィールドにしSystem.String.Empty
ます。
public class Person
{
public string Name { get; set; }
public string Address { get; set; }
public static readonly Person Default = new Person()
{
Name = "Some Name",
Address = "Some Address"
};
}
...
public static void Main(string[] args)
{
string address = String.Empty;
Person person = Person.Default;
//the rest of your code
}
クラスにnull以外のデフォルト値を何らかの方法で定義できる言語機能がないのはなぜだろうと思っている場合は、クラスが「参照型」であることを思い出してください。参照型は、割り当てられたメモリへの参照です。つまり、 null 以外のものは、メモリの割り当てが必要なオブジェクトの構築されたインスタンスです。したがって、「default」キーワードを .NET に統合してクラスで機能させる方法について考えてみると、次の 2 つの実装が考えられます。
デフォルトとしてマークされている静的インスタンスを定義できます。「デフォルト」はアクセス修飾子のようになるかもしれません (例: public default readonly など)。これはうまくいくかもしれません。しかし、それは本当に価値のある言語機能なのでしょうか? 少なくともこの方法では、すべての「デフォルト」はメモリの同じ静的インスタンスを指します。
クラスで default キーワードを使用するたびにデフォルト コンストラクターが呼び出されたとしたらどうでしょうか。参照を比較しないように Equals をオーバーライドしないと、2 つのデフォルト値が互いに等しくない可能性があるため、これはひどいことです。また、メモリ管理とメモリ割り当てのパフォーマンス ヒット、およびコンストラクタからの副作用のためにひどいことになります。
要約すると、これは私たちが本当に望んでいない言語機能だと思います。また、default(MyClass) は常に == null になります。
参照型の場合、デフォルト値は になりnull
、値型の場合は依存します。
Assert.IsTrue(default(MyClass) == null);