2012-06-27 3 views
0

Я не думаю, что это возможно в C#, но в любом случае плохое сообщение.Сохранение объекта в массиве, а затем построение?

Учитывая мой код

Control ctrlA = null, ctrlB = null; 
var ctrlCollection = new []{ctrlA, ctrlB}; 
for (int i = 0; i < ctrlCollection.length;i++) 
ctrlCollection[i] = new Control(); 

Можно ли строить эти два объекта и их ссылки на соответствующие переменные (ctrlA и ctrlB)? Как бы то ни было, ctrlA и ctrlB будут по-прежнему иметь нулевые ссылки.

+0

Вы пытаетесь _defer_ инициализировать объект? Если вы находитесь на .NET 4.0+, взгляните на [Lazy Initialization] (http://msdn.microsoft.com/en-us/library/dd997286.aspx) –

ответ

4

Нет, это не так. (по крайней мере, если вы не хотите работать с указателями или что-то еще) Будет ли это работать на вас?

var ctrlCollection = new Control[2]; 
for (int i = 0; i < ctrlCollection.Length; i++) 
    ctrlCollection[i] = new Control(); 
Control ctrlA = ctrlCollection[0], ctrlB = ctrlCollection[1]; 
+0

Ударьте меня к нему ... Я печатаю слишком медленно. – KennyZ

+0

+1 Правильно и также предлагает решение. Мой ответ даже не отвечает на вопрос. Я должен понизить себя. – Sumo

2

Это не сработает. В коллекции хранятся только ссылки на ее содержимое, в вашем случае ctrlA и ctrlB. Когда выполняется оператор ctrlCollection[i] = new Control();, эта ссылка заменяется другой.

ctrlA будет по-прежнему указывает на первоначальном ctrlA ссылки (будучи нулевым), ctrlCollection[i] указывает на вновь инициализируется Control объекта.

+1

10K rep, наконец :) –

0

Это по существу то же самое, что и явное определение длины массива. Нет необходимости добавлять нули в массив, а затем перезаписывать нуль с помощью вновь созданного элемента управления в элементе массива.

var ctrlCollection = new Control[2]; 
for (int i = 0; i < ctrlCollection.Length; i++) 
    ctrlCollection[i] = new Control(); 
0
var ctrlCollection = new []{ctrlA, ctrlB}; 
for (int i = 0; i < ctrlCollection.length;i++) 
{ 
    ctrlCollection[i] = new Control(); 
} 
Control ctrlA = ctrlCollection[0]; 
Control ctrlB = ctrlCollection[1]; 

Не можете себе представить, почему вы хотите, но это должно делать то, что я думаю, что вы просите.

0

Предполагая, что размер вас коллекция фиксирован вы можете сделать это:

Control ctrlA, ctrlB; 
var controls = new[] { 
    ctrlA = new Control(), 
    ctrlB = new Control() 
}; 

Это требует, чтобы Control переменных объявляется в том же объеме, как Control массива инициализируются.

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