[英]C# creating an array in a singelton class
我想创建一个Disc数组,其ID喜欢包含string [] Record,int NumberHeads和string扩展字段。 所以基本上将它们分组并一次实例化数组一次,因为我不希望在内存中有多个该数组。 我该怎么办,因为我的字段似乎不在Disc数组下,并且如果将它们公开并运行应用程序,则会得到null引用异常。
我最初使用的是结构,但后来我意识到这些不能在C#中的各个类之间传递。
class DiscType
{
private static DiscType[] disc;
private static string[];
public bool discSelect;
public int maxRecord;
public int numberHeads;
public string extension;
public static string[] Record
{
get
{
if (record == null)
{
record = new string[1000];
}
return record;
}
}
public static DiscType[] Disc
{
get
{
if (disc == null)
{
disc = new DiscType[10];
}
return disc;
}
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i < DiscType.Disc.Length; i++)
{
DiscType.Disc[i].Record[i]= "1";
}
}
}
如果只想对数组进行一次实例化,就可以这样:
public class Singleton
{
private static Singleton instance;
public string[] MyArray { get; set; }
//better using a List<string>
private Singleton() {
//instanciate MyArray here
}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
之后,您只需要这样称呼它:
Singleton.intance.MyArray
您描述了两个问题:
Disctype是单身人士吗?
其他人已经描述了如何创建一个Singleton,所以我不会写这个。 但是我怀疑您设计中的DiscType是否真的是单例。 如果用语言描述您的设计,您会谈论一个唯一的光盘类型 ,还是会说:“尽管在我的设计世界中,可能有几种不同的光盘类型,但是由于内存和存储量巨大, mabye,因为创建它的时间很长,建议在会话期间仅使用一种光盘类型。
在后一种情况下,您不应将其设计为单例。 著名的四人帮在他们的书中写道,设计模式(描述单例的地方)是设计的主要规则之一:
变革设计
这就是说,您不应仅在不需要当前使用情况的情况下限制设计。 如果在当前配置中只需要一种光盘类型,则只需创建一种。 如果在将来的版本中需要两个,则无需更改光盘类型。
因此,请仔细检查您的设计:我们是否在谈论“唯一的光盘类型”? 还是因为内存不足而只限制一个?
为什么我的记录数组为空
要了解这一点,您需要了解值类型和引用类型之间的区别。 简单类型和结构是值类型。 它们一声明就存在。 类的实例始终是引用类型:您需要调用new ...来创建它们。 如果不这样做,则该值为null。
Myclass X;
string text;
int i;
System.Drawing.Point p; // a Point is a struct!
回到你的问题
您的代码:
public static string[] Record
{
get
{
if (record == null)
{
record = new string[1000];
}
return record;
}
}
您分配一个新创建的对象进行记录。 该对象是字符串数组,它们是引用类型。 您尚未为每个字符串分配任何内容,因此数组中的每个字符串仍为null,在分配内容之前您无法对其进行任何操作。
但是,字符串数组已初始化。 您可以使用数组的方法。 您可以要求数组的长度。 您还可以要求获得未初始化(空)字符串的item [3]。
列表而不是数组顺便说一句,这种初始化方法有点不寻常。 我想您只要不使用记录就不想为记录保留内存。 您将通过使用List来实现。
我的建议是使自己熟悉类List。 这将使您的生活变得更加轻松。 不久之后,您将渴望了解所有集合类:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.