Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > массив типа класса


Автор: Bogdan1024 24.7.2006, 23:24
Допустим, есть класс с, создаю массив
c[] arr = new c[10];
Все элементы массива оказываются несозданными. Создаю их при помощи
for (int i = 0; i<arr.Length; i++)
c[i] = new c();
А есть какой-то более красивый метод создавать массивы с уже созданными объектами smile ? 

Автор: ivashkanet 25.7.2006, 08:48
Только такой  smile 
Код

foreach( c _c in arr){_c = new c()}

Кста, foreach работает быстрее for  smile 
А лучше всего сделать с не классом, а структурой. 
Структура всегда инициализированна значением по умолчанию
 smile  

Автор: Prehistorik 25.7.2006, 08:49
Нет. Представь себе, что у тебя конструктор не поумолчанию, а с параметрами. И как компилятор поймёт, какие параметры, какому классу сунуть? 

Автор: Bogdan1024 25.7.2006, 16:41
ivashkanet, foreach перебирает элементы только для чтения, тоесть, вызвать конструктор не получится
Prehistorik, спасибо что объяснил 

Автор: Void 25.7.2006, 16:49
ivashkanet, переменные итерации foreach неизменяемы. 

Автор: Sartorius 25.7.2006, 18:29
Вот так мона (конструктор без параметров)

Код

            C[] myC = new C[3]  {new C(),new C(),new C()};


Вообще new С[n]  создает ссылку на массив и соответственно выделяет память под n ссылок в куче. Но .Net требует , что бы при обращении к элементу массива, он был связан с реальным объектом - иначе Exception. Поэтому инициализировать обязательно for-ом или как написано выше. Вот только разом указать инициализирующую переменную для всех экземпляров массива у меня не получилось...

 

Автор: mr.DUDA 25.7.2006, 22:59
Sartorius, вообще это и не нужно smile 

Автор: RobbieV 25.7.2006, 23:35
Думаю, можно поступить так, создать такой класс и юзать его для инициализации твоих массивов:
    
Код

class ArrInit<T> where T : new()
    {
        public static void Init(T[] arr)
        {
            for (int c = 0; c<arr.Length; c++)
            {
                arr[c] = new T();
            }
        }
    }



Вот пример, как его можно использовать:
Код

c[] arr = new c[10];
ArrInit<c>.Init(arr);
  

Но только для C# не ниже 2.0.  

Автор: ivashkanet 26.7.2006, 09:03
Цитата(Bogdan1024 @  25.7.2006,  16:41 Найти цитируемый пост)
ivashkanet, foreach перебирает элементы только для чтения, тоесть, вызвать конструктор не получится

Цитата(Void @  25.7.2006,  16:49 Найти цитируемый пост)
ivashkanet, переменные итерации foreach неизменяемы. 

Блин, а я не знал (вернее знал, но забыл) и работал  smile 
Правда у меня VB .Net
Пример:
Код

   For Each row As ProductionOrdersTableRow In rows
                Dim StartDateTime As DateTime = row.StartDateTime
                Dim StopDateTime As DateTime = row.StopDateTime

                Select Case currentDateTime
                    Case Is <= StartDateTime
                        completePercent = 0
                    Case Is >= StopDateTime
                        completePercent = 100
                    Case Else
                        completePercent = Convert.ToInt32(Math.Round((currentDateTime.Ticks - StartDateTime.Ticks) / (StopDateTime.Ticks - StartDateTime.Ticks) * 100, 0))
                End Select
                row.CompletePercent = completePercent.ToString & " %"
            Next

 smile  smile  smile  smile  smile  

Автор: Prehistorik 26.7.2006, 09:20
ivashkanet, заметь, ты не изменяешь row... ты просто с его свойством работаешь... Хотя интересно... Ща попробую.... 

Автор: ivashkanet 26.7.2006, 09:20
Правда я саму переменную не менял, а только объект который лежит по адресу содержащемуся в переменной.
P.S. А на кой такое ограничение  smile  smile 
 

Автор: ivashkanet 26.7.2006, 09:58
Занялся тестрованием такой ситуации, оказалось:
В foreach можно менять только элементы объекта итерации, но не сам объект.
В VB можно попытаться изменить и его (ошибки компиляции не будет, и в IL все перенесется нормально), но тольку от этой операции 0. Объект будет все равно старым  smile 
Вот такие косяки  smile 
И еще хочу напомнить: 
Цитата(ivashkanet @  26.7.2006,  09:20 Найти цитируемый пост)
 А на кой такое ограничение

 

Автор: Prehistorik 26.7.2006, 12:47
ivashkanet, Я думаю, что такое ограничение нужно для того, чтобы подтверждался известный тезис МелкоЛегко, что foreach безопаснее for. 

Автор: ivashkanet 26.7.2006, 12:55
 smile 
Мне просто foreach нравится намного больше for  smile 
Цитата(Prehistorik @  26.7.2006,  12:47 Найти цитируемый пост)
МелкоЛегко

Ы? MS? 

Автор: mr.DUDA 26.7.2006, 14:14

 ! 
mr.DUDA
Прекращаем оффтоп, товарищи !
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)