我想创建一个Disc数组,其中包含字段string [] Record,int NumberHeads和string extension。所以基本上将它们分组并实例化一次,只有一次,因为我不想在内存中有多个这个数组。我怎么能这样做,因为我的字段似乎不在数组光盘下,如果我将它们公开并运行应用程序,我得到一个空引用异常。
我最初使用的是结构,但我意识到这些不能在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";
}
}
}
答案 0 :(得分:0)
如果您只希望对阵列进行一次实例化,请执行以下操作:
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
答案 1 :(得分:0)
您描述了两个问题:
Disctype是单身吗?
其他人已经描述过如何创建一个Singleton,所以我不会写这个。但是我怀疑你的设计中的DiscType是否真的是单身。如果你用文字描述你的设计,你会谈论唯一的disctype ,或者你会说:“虽然在我的设计世界中可能有几种不同的disctypes,但是因为由于创建一个内存和mabye的时间很长,建议在会话期间只使用一个disctype“。
在后一种情况下,您不应将其设计为单身。着名的四人小组在他们的书中写道,设计模式(描述单身人士)是设计的主要规则之一:
设计变更
这意味着,您不应仅限于在当前使用中不需要的情况下限制您的设计。如果在当前配置中,您只需要一个disctype,只需创建一个。如果在将来的版本中你需要两个,你不需要改变你的disctype。
仔细检查你的设计:我们是在谈论“唯一的disctype”吗?或者我们只限制一个,因为我们没有足够的记忆?
为什么我的记录数组为空
要理解这一点,您需要了解值类型和引用类型之间的区别。简单类型和结构是值类型。它们一声明就存在。类的实例始终是引用类型:您需要调用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;
}
}
您指定新创建的对象进行记录。对象是一个字符串数组,它们是引用类型。您没有为每个字符串分配任何内容,因此数组中的每个字符串仍然为空,并且在分配内容之前,您无法对它们执行任何操作。
然而,字符串数组已初始化。您可以使用数组的方法。您可以询问阵列的长度。你也可以要求你获得未初始化(空)字符串的项目[3]。
列出而不是数组 顺便说一句,这种初始化方法有点不寻常。我猜你不想为记录保留记忆,只要你不使用它们。你可以通过使用List来实现这一点。
我的建议是熟悉班级列表。它会让你的生活变得更加轻松。不久之后,你会感觉到了解所有收藏课程的愿望: - )