web-dev-qa-db-ja.com

C#のユーザー定義クラスのデフォルト値

いくつかのコードがデフォルト値を返すことがわかりますので、ユーザー定義のクラスについては、コンパイラがデフォルト値をどのように定義するのでしょうか?

52
Benny

残りの部分でチャイムするには、nullになりますが、defaultを使用して、任意のタイプのデフォルト値を取得できることも追加する必要があります。

_default(MyClass) // null
default(int) // 0
_

ジェネリックを扱うときに特に役立ちます。戻り値の型がTであり、null許容であると仮定したくない場合は、default(T)を返します。

60
David Hedlund

classのデフォルト値はnullです

14
Graviton

注:DefaultValueAttributeによって、メンバーが属性の値で自動的に初期化されることはありません。コードに初期値を設定する必要があります。

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 を参照してください

11
Peter

クラスのデフォルト値はnullです。構造体の場合、デフォルト値は、構造体のデフォルトのパラメーターなしコンストラクターをインスタンス化したときに取得される値と同じです(この方法でオーバーライドすることはできません)。同じルールが、クラスまたは構造内に含まれるすべてのフィールドに再帰的に適用されます。

7
Konamiman

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
}
3
Yom S.

参照型の場合、デフォルト値はnullになります。値型の場合、依存します。

3
Darin Dimitrov
Assert.IsTrue(default(MyClass) == null);
2
Bryan Watts

何らかの方法で参照型のnull以外の既定値を定義する場合は、参照型が既定値を持つことは意味がないことを理解してください。ある時点で、参照は構築されたオブジェクトに割り当てられたメモリを指す必要があります。それを可能にするために、2つの実装を想像します。

  1. 静的インスタンスをデフォルトとして定義します。これは機能する可能性がありますが、おそらく静的インスタンスを取得する場所をコンパイラーに特定するための非常に不格好な方法が必要になります。言語に入れる価値のある機能ではありません。

  2. 式でデフォルト値が発生するたびにデフォルトコンストラクターを呼び出すことを許可します:これは、参照を比較しないようにEqualsをオーバーライドしなかったため、2つのデフォルト値が等しくない可能性があることを心配する必要があるため、ひどいものになりますメモリ管理とメモリ割り当てのパフォーマンスが低下し、コンストラクタからの副作用が発生します。

要約すると、私はそれが本当に望まない言語機能だと思います。そして、default(MyClass)は常に== nullになります。

1
AndyClaw