3

コンストラクターでインスタンス化せずにオブジェクトを自動的にインスタンス化する方法はありますか?

実際、私は次のようなものを持っています:

public List<Object> Products { get; set; }
public MyClass()
{
    this.Products = new List<Object>();
}

しかし、代わりに、クラスのコンストラクターで次のようなものを指定せずに、リストを直接インスタンス化したいと思います。

public List<Object> Products = new List<Object>(); { get; set; }

これを行うためのトリックはありますか?

4

3 に答える 3

4

自動実装されたプロパティに初期値を与えることができるかどうかを尋ねていると思います。その質問に対する答えは「いいえ」です。

ただし、手動プロパティを作成できます。

private List<Product> products = new List<Product>();

public List<Product> Products
{
    get { return products; }
    set { this.products = value; }
}

実際にセッターが必要ですか?クライアントが変数値を別のリストに置き換えられるようにする必要がありますか? 読み取り専用プロパティのみが必要な場合は、次のように記述できます。

private readonly List<Product> products = new List<Product>();

public IList<Product> Products { get { return products; } }

ここでもコレクション初期化子を使用できることに注意してください。

Foo foo = new Foo
{
    Products = { new Product("foo"), new Product("bar") }
};
于 2013-02-12T19:37:30.977 に答える
3

ジョン・スキートが言うように:

残念ながら、現在これを行う方法はありません。コンストラクターで値を設定する必要があります。(コンストラクター チェーンを使用すると、重複を避けることができます。)

自動的に実装されたプロパティは今のところ便利ですが、確かにより良いものになる可能性があります。コンストラクターでのみ設定でき、読み取り専用フィールドによってサポートされる読み取り専用の自動的に実装されたプロパティと同じくらい頻繁に、この種の初期化を望んでいるとは思いません。これらの両方が C# 5 で修正される可能性があります。これにより、不変性の問題が解決されることを強く願っています。(どちらも C# 4 で予定されているとは思いません。)

ソース: C# 自動プロパティの初期化


を初期化する必要がある場合property without using the constructorは、backing field.

class Demo
{
    private List<object> myProperty = new List<object>();
    public List<object> MyProperty
    {
        get { return myProperty; }
        set { myProperty = value; }
    }
}
于 2013-02-12T19:37:18.503 に答える
1

C# では、現在、自動生成されたプロパティはありません (ただし、VB.NET の自動プロパティはこれを行うことができます)。これは、私がしばしば自分自身に望んでいたことです。そのため、独自のプロパティを手動でロールするか、コンストラクターを使用できます。

いずれにせよ、これを行うために記述する必要のないコードがいくつかあります (コンストラクターを使用しない手動プロパティと、コンストラクターを使用する自動プロパティ)。

ただし、興味深いことに、IL は 2 つのオプションで異なります。初期化子を使用してバッキング フィールドを持つ手動プロパティがある場合、C# の基本クラス コンストラクターの前に実行されます。

MyClass..ctor:
IL_0000:  ldarg.0     
IL_0001:  newobj      System.Collections.Generic.List<System.Object>..ctor
IL_0006:  stfld       UserQuery+MyClass._products
IL_000B:  ldarg.0     
IL_000C:  call        System.Object..ctor
IL_0011:  nop         
IL_0012:  ret         

コンストラクターで初期化を伴う自動プロパティを使用すると、C# の基本クラス コンストラクターの後に実行されます。

MyClass..ctor:
IL_0000:  ldarg.0     
IL_0001:  call        System.Object..ctor
IL_0006:  nop         
IL_0007:  nop         
IL_0008:  ldarg.0     
IL_0009:  newobj      System.Collections.Generic.List<System.Object>..ctor
IL_000E:  call        UserQuery+MyClass.set_Products
IL_0013:  nop         
IL_0014:  nop         
IL_0015:  ret       

.NET で初期化順序に依存するコードを記述することは危険な場合があるため、これは単なる好奇心として言っているだけです (実際、初期化順序は VB.NET と C# で少し異なります)。

于 2013-02-12T19:37:08.423 に答える