2015-11-10 2 views
0

Я хочу создать массив диска, id которого хотел бы включить поля string [] Record, int NumberHeads и расширение строки. поэтому в основном группируя их и создавая экземпляр массива один раз и только один раз, поскольку я не хочу больше одного из этого массива в памяти. Как я могу сделать это, так как мои поля, похоже, не находятся под массивом Disc, и если я сделаю их общедоступными и запустим приложение, я получаю исключение с нулевой ссылкой.C#, создающий массив в классе singelton

Первоначально я использовал структуру, но я понял, что они не могут быть переданы из класса в класс в 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"; 
     } 
    } 
} 
+3

Если вы не заполнили некоторые данные, 'DiscType.Disc [i]' останется 'null'! Вы инициализируете 'Array' в' InitializeComponent() '? –

+0

Вы можете пропустить 'if (disc == null)' if You 'private static DiscType [] disc = new DiscType [10]' – ntohl

+0

'record' не существует –

ответ

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

Это правда. Он мог бы взглянуть на эту ссылку, если он хочет сделать это потокобезопасным https://msdn.microsoft.com/en-us/library/ff650316.aspx – OrcusZ

+0

Спасибо за все ваши ответы, попробуем некоторые из предложений – Russ

0

Вы описали две проблемы :

  • После того, как вы считаете, что создали Dis cType и массив записей, ваш массив записей содержит только нулевые значения
  • Ваш DiscType не является ничем.

Is Disctype singleton?

Кто-то еще уже описал, как создать синглтон, поэтому я не буду писать это. Однако я сомневаюсь, что DiscType в вашем дизайне действительно является синглом. Если бы вы охарактеризовали ваш дизайн словами, не могли бы вы рассказать о об одном и том же типе, или вы бы сказали: «Хотя в моем спроектированном мире это может быть, что было несколько разных дисципсов, однако из-за огромного количества памяти и mabye из-за времени, необходимого для его создания, рекомендуется использовать только один дисцип в ходе сеанса ».

В последнем случае вы не должны проектировать его как одноэлементный. Знаменитая банда из четырех человек написал в своей книге о шаблонах проектирования (где описывается синглтон) в качестве одного из основных правил дизайна:

Дизайн для изменения

Это означает, что вы не должны ограничивайте свой дизайн только тем случаем, когда в текущем использовании он не нужен. Если в вашей текущей конфигурации вам нужен только один disctype, просто создайте только один. Если в будущих версиях вам нужно два, вам не нужно менять свой дисцип.

Так тщательно просмотрите свой дизайн: говорим ли мы о «единственном и единственном дисципле»? или мы ограничиваемся только тем, что у нас недостаточно памяти?

Почему мой массив записей пустых

Чтобы понять это, вы должны знать разницу между типами значений и ссылочными типами. Простые типы и структуры - это типы значений. Они существуют, как только вы их объявляете. Экземпляры классов всегда являются ссылочными типами: вам нужно вызвать новое ... для их создания. Если вы этого не сделаете, значение равно null.

Myclass X; 
string text; 
int i; 
System.Drawing.Point p; // a Point is a struct! 
  • X и текст оба имеют нулевое значение, единственное, что вы можете сделать с ними, прежде чем назначить что-то к ним и сравнивать их с нулевым
  • и р уже имеют значение. Вы можете получить их и вызвать их методы.

Вернуться к вашей проблеме

Ваш код:

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

присваивается вновь созданный объект для записи. объект представляет собой массив строк, которые являются ссылочными типами. Вы не назначили ничего для каждой строки, поэтому каждая строка в вашем массиве по-прежнему равна нулю, и вы ничего не можете с ними сделать, пока не назначите что-то.

Массив строк, однако, инициализирован. Вы можете использовать методы массива. Вы можете задать длину массива. Вы также можете запросить элемент [3], в котором вы получите неинициализированную (нулевую) строку.

Список вместо массива Кстати, этот метод инициализации немного необычен. Думаю, вы не хотите резервировать память для записей, пока вы их не используете. Вы бы это сделали, используя List.

Советую ознакомится с классом. Это сделает вашу жизнь намного проще. Вскоре вы почувствуете желание узнать все классы коллекции :-)

Смежные вопросы