Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我怎样才能在上面得到一个物体';谁的创造?_C#_Oop - Fatal编程技术网

C# 我怎样才能在上面得到一个物体';谁的创造?

C# 我怎样才能在上面得到一个物体';谁的创造?,c#,oop,C#,Oop,我想知道我怎样才能在一个物体被创造出来的时候得到它。我有两个类,一个叫做Product,另一个叫做Inventory,这是一个静态类。 以下是产品类别的定义: public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public int Quantity { get; s

我想知道我怎样才能在一个物体被创造出来的时候得到它。我有两个类,一个叫做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 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; }
}
以下是库存类别的定义:

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

但是,如果我使用构造函数执行此操作,我将得到一个
NullReferenceException
,因为
Products
尚未初始化。初始化静态
产品
列表的最佳位置在哪里?

空引用不是
产品
,而是列表。在尝试使用静态列表之前,只需初始化它。它自己的类的静态初始值设定项是一个很好的地方:

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

    static Inventory()
    {
        Products = new List<Product>();
    }
}
公共静态类清单
{
公共静态列表产品{get;set;}
静态库存()
{
产品=新列表();
}
}

空引用不是
产品,而是列表。在尝试使用静态列表之前,只需初始化它。它自己的类的静态初始值设定项是一个很好的地方:

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

    static Inventory()
    {
        Products = new List<Product>();
    }
}
公共静态类清单
{
公共静态列表产品{get;set;}
静态库存()
{
产品=新列表();
}
}

初始化静态属性有不同的可能性。例如,您可以使用只读备份字段:

public static class Inventory
{
    private static readonly List<Product> products = new List<Product>();
    public static List<Product> Products { get { return products; } }
}
公共静态类清单
{
私有静态只读列表产品=新列表();
公共静态列表产品{get{return Products;}}
}
由于C#6,您可以改用只读属性:

public static class Inventory
{        
    public static List<Product> Products { get; } = new List<Product>();
}
公共静态类清单
{        
公共静态列表产品{get;}=new List();
}
或者(如前所述),您可以使用静态构造函数:

public static class Inventory
{        
    public static List<Product> Products { get; private set; }
    static Inventory()
    {
         Products = new List<Product>();
    }
}
公共静态类清单
{        
公共静态列表产品{get;private set;}
静态库存()
{
产品=新列表();
}
}

初始化静态属性有不同的可能性。例如,您可以使用只读备份字段:

public static class Inventory
{
    private static readonly List<Product> products = new List<Product>();
    public static List<Product> Products { get { return products; } }
}
公共静态类清单
{
私有静态只读列表产品=新列表();
公共静态列表产品{get{return Products;}}
}
由于C#6,您可以改用只读属性:

public static class Inventory
{        
    public static List<Product> Products { get; } = new List<Product>();
}
公共静态类清单
{        
公共静态列表产品{get;}=new List();
}
或者(如前所述),您可以使用静态构造函数:

public static class Inventory
{        
    public static List<Product> Products { get; private set; }
    static Inventory()
    {
         Products = new List<Product>();
    }
}
公共静态类清单
{        
公共静态列表产品{get;private set;}
静态库存()
{
产品=新列表();
}
}

在哪里调用
Inventory.Products=newlist()?如果没有,这就是NullRefreferenceException的原因,您没有初始化
产品
。您在这个对象中得到了什么。你的调试建议是什么?@RenéVogt谢谢你。问题确实是这样。但是如果Products属性是一个静态类,并且不能有构造函数,那么初始化它的正确方法是什么呢?@DirtyDeveloper在对象中我得到了它的所有属性。但是我不知道在哪里初始化列表,因为它是一个静态类创建只读属性。在旧的c#版本中,您可以创建一个只读备份字段并对其进行初始化,让getter只返回该备份字段?如果没有,这就是NullRefreferenceException的原因,您没有初始化
产品
。您在这个对象中得到了什么。你的调试建议是什么?@RenéVogt谢谢你。问题确实是这样。但是如果Products属性是一个静态类,并且不能有构造函数,那么初始化它的正确方法是什么呢?@DirtyDeveloper在对象中我得到了它的所有属性。但是我不知道在哪里初始化列表,因为它是一个静态类创建只读属性。在旧的c#版本中,您可以创建一个只读备份字段并初始化它,让getter只返回该备份字段。同意!但不确定他想要什么?这是正确的面向对象的处理方式吗?大卫,谢谢你,问题确实在于此。然而,它是一个静态类,因此据我所知,不能有构造函数。哪里是初始化列表的最佳位置?@arthur:在静态构造函数中,如答案所示。你在尝试时遇到错误了吗?@David你说得对。在我重建整个解决方案之后,它工作了。非常感谢。使用静态列表不是非常安全的,应该考虑一些更好的选择。同意!但不确定他想要什么?这是正确的面向对象的处理方式吗?大卫,谢谢你,问题确实在于此。然而,它是一个静态类,因此据我所知,不能有构造函数。哪里是初始化列表的最佳位置?@arthur:在静态构造函数中,如答案所示。你在尝试时遇到错误了吗?@David你说得对。在重建整个解决方案之后,它工作了。非常感谢。使用静态列表不是线程安全的,应该考虑一些更好的替代方案。