C#在singelton类中创建一个数组

时间:2015-11-10 12:56:35

标签: c# arrays struct singleton

我想创建一个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";
        }   
    }
}

2 个答案:

答案 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和记录数组之后,您的记录数组只包含空值
  • 您的DiscType不是单身。

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!
  • X和文本都有一个空值,在为它们分配内容之前,你唯一可以用它们做的就是将它们与null进行比较
  • 我和p已经有了价值。你可以得到它们并调用它们的方法。

回到您的问题

您的代码:

public static string[] Record
{
    get
    {
        if (record == null)
        {
            record = new string[1000];
        }
        return record;
    }
}

您指定新创建的对象进行记录。对象是一个字符串数组,它们是引用类型。您没有为每个字符串分配任何内容,因此数组中的每个字符串仍然为空,并且在分配内容之前,您无法对它们执行任何操作。

然而,字符串数组已初始化。您可以使用数组的方法。您可以询问阵列的长度。你也可以要求你获得未初始化(空)字符串的项目[3]。

列出而不是数组 顺便说一句,这种初始化方法有点不寻常。我猜你不想为记录保留记忆,只要你不使用它们。你可以通过使用List来实现这一点。

我的建议是熟悉班级列表。它会让你的生活变得更加轻松。不久之后,你会感觉到了解所有收藏课程的愿望: - )