2016-12-29 5 views
0

나는 창조물을 어떻게 얻을 수 있는지 알고 싶다. Product라는 클래스와 Static 클래스 인 Inventory라는 두 클래스가 있습니다. 입력 한 제품의 객체가 생성이되면,개체를 만들 때 어떻게 가져올 수 있습니까?

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

것은 내가이 다음의하고 싶으면 무엇 : 여기에 재고 클래스의 정의입니다

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

: 다음은 제품 클래스의 정의입니다 이 개체는 Inventory.Products 목록에 추가되어야하므로 나중에 인벤토리 정보를 쿼리 할 수 ​​있습니다.

나는 제품 클래스 내에서 같은 것을 할 수 있도록하고 싶습니다 :

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; } 
} 

을 그러나 나는 내가 NullReferenceException 얻을 것이다이 작업을 수행 할 생성자를 사용하는 경우, Products가 아직 초기화되지 않기 때문에. 정적 인 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>(); 
    } 
} 
관련 문제