C# 我怎样才能在上面得到一个物体';谁的创造?
我想知道我怎样才能在一个物体被创造出来的时候得到它。我有两个类,一个叫做Product,另一个叫做Inventory,这是一个静态类。 以下是产品类别的定义: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
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你说得对。在重建整个解决方案之后,它工作了。非常感谢。使用静态列表不是线程安全的,应该考虑一些更好的替代方案。