2016-12-29 5 views
0

私はそれが創作時にどのようにオブジェクトを得ることができるか知りたいと思います。私は2つのクラス、Productというクラスと、静的なクラスであるInventoryという別のクラスを持っています。ここ は、製品クラスの定義です:作成時にオブジェクトを取得するにはどうすればよいですか?

public class Product 
{  
    public int Id { get; set; } 
    public string Name { get; set; } 
    public decimal Price { get; set; } 
    public int Quantity { get; set; } 
} 

はここでインベントリクラスの定義です:

public static class Inventory 
{ 
    public static List<Product> Products { get; set; } 
} 

私はそれが型製品のオブジェクトはそれが作成されています以下、だやりたい何か、このオブジェクトはInventory.Productsリストに追加する必要があるので、後で在庫情報を照会することができます。

私は、Productクラスの内部でこのような何かをできるようにしたいと思います:

public class Product 
{ 
    public Product() 
    { 
     Inventory.Products.Add(this);    
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public decimal Price { get; set; } 
    public int Quantity { get; set; } 
} 

私はこれを行うには、コンストラクタを使用している場合Productsがまだ初期化されていないので、しかし、私は、NullReferenceExceptionを取得します。静的Productsリストを初期化する最適な場所はどこですか?

+0

ここで、 'Inventory.Products = new List ();'を呼び出しますか?それがNullRefeferenceExceptionの理由でない場合、 'Products'を初期化しませんでした。 –

+0

このオブジェクトには何が入っていますか?あなたのデバッグは何を提案しますか? –

+0

@RenéVogtありがとう。本当に問題なのです。インベントリが静的クラスで、コンストラクタを持つことができない場合、Productsプロパティを初期化する正しい方法はどこですか? – artie

答えて

1

null参照はProductではありません。リストです。静的リストを使用する前に、静的リストを初期化するだけです。独自のクラスの静的初期化子は、それを行うのに適した場所です。

public static class Inventory 
{ 
    public static List<Product> Products { get; set; } 

    static Inventory() 
    { 
     Products = new List<Product>(); 
    } 
} 
+0

同意します!しかし、彼が何を望んでいるか分からない?それは正しいOOP方法ですか? –

+0

David、ありがとう、それは本当に問題です。しかし、インベントリは静的なクラスなので、私が知る限りコンストラクタを持つことはできません。リストを初期化するのに最適な場所はどこですか? – artie

+0

@arthur:*静的な*コンストラクタでは、解答に示されているとおりです。これを試みたときにエラーが発生しましたか? – David

1

静的プロパティを初期化する方法はさまざまです。あなたは静的コンストラクタを使用することができます(すでに示唆したDavidとして)

public static class Inventory 
{   
    public static List<Product> Products { get; } = new List<Product>(); 
} 

または:あなたの代わりに読み取り専用プロパティを使用することができます

public static class Inventory 
{ 
    private static readonly List<Product> products = new List<Product>(); 
    public static List<Product> Products { get { return products; } } 
} 

C#6ので:あなたは、例えば読み取り専用のバッキングフィールドを使用することができます:

public static class Inventory 
{   
    public static List<Product> Products { get; private set; } 
    static Inventory() 
    { 
     Products = new List<Product>(); 
    } 
} 
関連する問題