Вы описали две проблемы :
- После того, как вы считаете, что создали 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.
Советую ознакомится с классом. Это сделает вашу жизнь намного проще. Вскоре вы почувствуете желание узнать все классы коллекции :-)
Если вы не заполнили некоторые данные, 'DiscType.Disc [i]' останется 'null'! Вы инициализируете 'Array' в' InitializeComponent() '? –
Вы можете пропустить 'if (disc == null)' if You 'private static DiscType [] disc = new DiscType [10]' – ntohl
'record' не существует –