2012-01-21 4 views
2

Итак, у меня есть класс (myClass), который я создал в своем приложении C#. При работе с массивами этого класса я думал, что довольно сложно писать цикл, чтобы заполнить массив объектов myClass. Я знаю, что когда вы создаете массив значений enum, этот массив уже заполняется экземплярами перечисления, для которых установлено значение по умолчанию.Создание массива объектов объектов-экземпляров

мне интересно, если же рода функциональность может быть достигнута с классом, так что вызов, как:

myClass[] myClassArray = new myClass[25]; 

приведет массив объектов MyClass, которые являются только экземплярами пустого конструктора для этот класс.

+0

Возможно дубликата: http://stackoverflow.com/questions/583574/c-sharp-why-do-you-need-to-instantiate-each-array-element – Tudor

+0

Причина, почему все поля ваш массив будет инициализирован с помощью null, так как классы являются ссылочными типами. Перечисления и примитивы являются типами значений и поэтому могут инициализироваться значением по умолчанию. –

+0

Не совсем дубликат; этот вопрос является вопросом «Как», в то время как другой вопрос «Почему» о поведении языка. –

ответ

2

Я знаю, что когда вы создаете массив значений перечисления, этот массив уже заполняется экземплярами перечисления, которые установлены в их значение по умолчанию.

Это происходит потому, что перечисления основаны на целых типах, которые являются типами значений и не могут быть null.

Самый простой способ инициализировать массив ссылочных типов - это цикл, как вы описали (вы можете написать очень короткий синтаксис для этого, используя LINQ).

+0

Этого я боялся. Я просто не был уверен, могу ли я перегрузить что-то в своем классе, чтобы облегчить ситуацию. – marrithl2

+0

@ marrithl2 - Как вы можете видеть из других ответов, вы можете написать: 1. Способ для этого. 2. Метод расширения. 3. Запрос LINQ для этого. Или, 4. По мере того как Henk отправил - конвертируйте класс в структуру, если это возможно. – Oded

7

Попробуйте это:

MyClass[] myClassArray = Enumerable 
    .Range(0, 25) 
    .Select(i => new MyClass()) 
    .ToArray(); 

Это позволит создать 25 экземпляров своего класса, и поместить их в массив.

+3

Вы не объявили цикл, но цикл все еще происходит. – Oded

+0

@OED Абсолютно, нет способа избежать цикла. Но вы можете хотя бы вытащить его из поля зрения. – dasblinkenlight

2

Почему бы не просто инкапсулировать раздражающий цикл в методе?

public T[] CreateInstances<T>(int arrayLength) where T: new() 
{ 
    T[] result = new T[arrayLength]; 
    for (int i=0; i<arrayLength; i++) 
     result[i] = new T(); 
    return result; 
} 
+0

Побей меня. Я думаю, что этот метод должен быть статическим, хотя ... и он пропускает «результат возврата» ;;;) – Nuffin

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