Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> массив типа класса 
V
    Опции темы
Bogdan1024
  Дата 24.7.2006, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 5
Всего: 13



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


--------------------
user posted image
PM MAIL   Вверх
ivashkanet
Дата 25.7.2006, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Только такой  smile 
Код

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

Кста, foreach работает быстрее for  smile 
А лучше всего сделать с не классом, а структурой. 
Структура всегда инициализированна значением по умолчанию
 smile  
PM MAIL WWW ICQ   Вверх
Prehistorik
Дата 25.7.2006, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 30.5.2006
Где: СПб

Репутация: 2
Всего: 3



Нет. Представь себе, что у тебя конструктор не поумолчанию, а с параметрами. И как компилятор поймёт, какие параметры, какому классу сунуть? 
--------------------
Есть только один бог - Ассемблер, и С - пророк его. 
PM MAIL   Вверх
Bogdan1024
Дата 25.7.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 5
Всего: 13



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


--------------------
user posted image
PM MAIL   Вверх
Void
Дата 25.7.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



ivashkanet, переменные итерации foreach неизменяемы. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Sartorius
Дата 25.7.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 1
Всего: 37



Вот так мона (конструктор без параметров)

Код

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


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

 
PM MAIL ICQ   Вверх
mr.DUDA
Дата 25.7.2006, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Sartorius, вообще это и не нужно smile 


--------------------
user posted image
PM MAIL WWW   Вверх
RobbieV
Дата 25.7.2006, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.7.2006

Репутация: нет
Всего: нет



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

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.  

Это сообщение отредактировал(а) RobbieV - 25.7.2006, 23:42
PM MAIL   Вверх
ivashkanet
Дата 26.7.2006, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(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  
PM MAIL WWW ICQ   Вверх
Prehistorik
Дата 26.7.2006, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 30.5.2006
Где: СПб

Репутация: 2
Всего: 3



ivashkanet, заметь, ты не изменяешь row... ты просто с его свойством работаешь... Хотя интересно... Ща попробую.... 
--------------------
Есть только один бог - Ассемблер, и С - пророк его. 
PM MAIL   Вверх
ivashkanet
Дата 26.7.2006, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Правда я саму переменную не менял, а только объект который лежит по адресу содержащемуся в переменной.
P.S. А на кой такое ограничение  smile  smile 
 
PM MAIL WWW ICQ   Вверх
ivashkanet
Дата 26.7.2006, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



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

 
PM MAIL WWW ICQ   Вверх
Prehistorik
Дата 26.7.2006, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 30.5.2006
Где: СПб

Репутация: 2
Всего: 3



ivashkanet, Я думаю, что такое ограничение нужно для того, чтобы подтверждался известный тезис МелкоЛегко, что foreach безопаснее for. 
--------------------
Есть только один бог - Ассемблер, и С - пророк его. 
PM MAIL   Вверх
ivashkanet
Дата 26.7.2006, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



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

Ы? MS? 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 26.7.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232




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


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0811 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.