繁体   English   中英

C#在singelton类中创建数组

[英]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和记录数组之后,记录数组仅包含空值
  • 您的DiscType不是单例。

Disctype是单身人士吗?

其他人已经描述了如何创建一个Singleton,所以我不会写这个。 但是我怀疑您设计中的DiscType是否真的是单例。 如果用语言描述您的设计,您会谈论一个唯一的光盘类型 ,还是会说:“尽管在我的设计世界中,可能有几种不同的光盘类型,但是由于内存和存储量巨大, mabye,因为创建它的时间很长,建议在会话期间仅使用一种光盘类型。

在后一种情况下,您不应将其设计为单例。 著名的四人帮在他们的书中写道,设计模式(描述单例的地方)是设计的主要规则之一:

变革设计

这就是说,您不应仅在不需要当前使用情况的情况下限制设计。 如果在当前配置中只需要一种光盘类型,则只需创建一种。 如果在将来的版本中需要两个,则无需更改光盘类型。

因此,请仔细检查您的设计:我们是否在谈论“唯一的光盘类型”? 还是因为内存不足而只限制一个?

为什么我的记录数组为空

要了解这一点,您需要了解值类型和引用类型之间的区别。 简单类型和结构是值类型。 它们一声明就存在。 类的实例始终是引用类型:您需要调用new ...来创建它们。 如果不这样做,则该值为null。

Myclass X;
string text;
int i;
System.Drawing.Point p;   // a Point is a struct!
  • X和text都具有null值,在为它们赋值之前,您唯一可以做的就是将它们与null进行比较
  • i和p已经有价值。 您可以获取它们并调用其方法。

回到你的问题

您的代码:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM