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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обьекты и коллекции, Как правильно пользоваться. 
:(
    Опции темы
Coocky
Дата 27.5.2005, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



1.Есть свой класс-Sashska .Внутри него есть поля. Одним из них есть обьект класса Rectangle rect.
Где мне лучше его инициализировать в кострукторе класса, зполнив предварительно нулями типа
Код

Rectangle rect=new Rectangle(0,0,0,0);

, а затем, заполняя через обьект
Код

s.rect=new Rectangle(6,7,5,6);
,
или можно вот так просто обьявив обьект конструкторе
Код

Rectangle rect;

а затем
Код

Sashka s=new Sashka();
s.rect=new Rectangle(6,7,5,6);


2. Есть ArrayList. Я заполняю его обьектами класса Sashka, через метод Add(s). Должен ли я каждій раз перед єтим методом делать
Код

s=new Sashka(); 
s.damka=false;
s.rect=new Rectangle(6,7,5,6);
//и т.д.
whitelist.Add(s);


, или достаточно один раз создать обьект, а затем делать
Код

s.damka=false;
s.rect=new Rectangle(6,7,5,6);
//и т.д.

whitelist.Add(s);


3.Почему я стучусь до обьектов через
Код

while(whitelist.GetEnumerator().MoveNext())
{
......}


Если есть в МСДН ArrayList.Item, но оно мне не доступно?????
З.І.Прошу пардон за много тем, но у меня блат:-))))

Это сообщение отредактировал(а) Coocky - 27.5.2005, 21:55


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Kurt
Дата 27.5.2005, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


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

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



1.
Рассмотрим первый случай.
Заполняем в конструкторе.
Цитата

Rectangle rect=new Rectangle(0,0,0,0);

Во-первых, ты что, поле класса объявляешь в конструкторе?!
Должно быть так:
Код

class Shashka {
  public Rectangle rect;
 ...
 public Shashka(){
   ..
   rect = new Rectangle(0,0,0,0);
  ...
 }
}

Ну, да ладно, не в этом дело.
Итак, смотрим. В данном случае у тебя будет следующее:
создается объект класса Shashka и в его конструкторе создается объект класса Rectangle. Что значит создан объект? Это значит выделена память, вызван конструктор и возвращена ссылка на выделенную область памяти.
Дальше ты делаешь
Код

s.rect=new Rectangle(6,7,5,6);

т.е. создаешь НОВЫЙ объект (т.е. опять выделяешь память и т.п.) класса Rectangle и присваиваешь ссылку на него полю s.rect. А что стало с тем объектом, что ты создал в конструкторе? А ничего - ссылка на него теряется и он будет убран GC.
Во-втором случае, при вызове конструктора Shashka() память на поле rect не выделяется.
Итог. Если ты гарантированно будешь вызывать
Код

s.rect=new Rectangle(6,7,5,6);
,
то в первом случае ты выделяешь лишнюю память. Тратишь и оперативку и процессорное время.

2.
Предложение
Код

whitelist.Add(s);

помещает в ArrayList ССЫЛКУ на объект s. Таким образом, если ты не будешь постоянно выполнять
Код

s=new Shashka();

то в ArrayList всегда будет добавляться одна и та же ссылка (т.е. один и тот же адрес памяти).
Кроме того, строки
Код

s.damka=false;    
s.rect=new Rectangle(6,7,5,6);

всегда будут изменять один и тот же объект.
Итог. Если не будешь выполнять "new Shashka" при каждом добавлении в ArrayList - получишь список, состоящий из ссылок на один и тот же объект, в к-м поля будут заполнены значениями, к-е присваивались перед последним добавлением.
Если не веришь - просто попробуй. smile

3.
Использовать foreach, или накрайняк for, религия не позволяет?




--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Coocky
Дата 27.5.2005, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Kurt
Ща, секунду, пререкурю-поспорить охота.. smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 28.5.2005, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Kurt
Цитата
Во-первых, ты что, поле класса объявляешь в конструкторе?!

Пардон, опечатался...Это ж не структура
Цитата
Итог. Если не будешь выполнять "new Shashka" при каждом добавлении в ArrayList - получишь список, состоящий из ссылок на один и тот же объект, в к-м поля будут заполнены значениями, к-е присваивались перед последним добавлением.
Если не веришь - просто попробуй

Пробовал, поэтому и спросил smile Теперь понятно-все 24 обекта последним прямоугольником заполнены smile
Цитата
Итог. Если ты гарантированно будешь вызывать

код C#
1:

s.rect=new Rectangle(6,7,5,6);




,
то в первом случае ты выделяешь лишнюю память. Тратишь и оперативку и процессорное время

Те. второй вариант-обьявление в классе, а за пределом-инициализация?
Цитата
Использовать foreach, или накрайняк for, религия не позволяет?

Не понял....Мне Item охота. Там всего один параметр index, и в цикле сгодится, но НЕТ Item. Недоступен!


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Kurt
Дата 28.5.2005, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


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

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



Цитата
Те. второй вариант-обьявление в классе, а за пределом-инициализация?

Если гарантировано потом будешь менять это поле - да. Это более эффективно.. Хотя.. По "всем правилам" в классе должны инициализированться по дефолту все поля.

Цитата
Мне Item охота. Там всего один параметр index, и в цикле сгодится, но НЕТ Item. Недоступен!

Слабо понимаю, чего ты хочешь. Пробежаться по всем элементам ArrayList'а? Тогда почему foreach не годится?


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Coocky
Дата 28.5.2005, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Kurt
Цитата
Слабо понимаю, чего ты хочешь. Пробежаться по всем элементам ArrayList'а? Тогда почему foreach не годится?

Итак, пишу с головы....
Насколько я знаю, или нашел в МСДН, для получения эллементы из массива по индексу, есть Item, и есть метод GetEnumerator().Первый мне почему-то не доступен(ну нет его в выпадающем списке) он и проще....
Цитата
Если гарантировано потом будешь менять это поле - да

Конечно гарантировано. Иначе константа...
Цитата
Хотя.. По "всем правилам" в классе должны инициализированться по дефолту все поля.

Так может "хотя" обсудим?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Kurt
Дата 28.5.2005, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


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

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



Цитата
Насколько я знаю, или нашел в МСДН, для получения эллементы из массива по индексу, есть Item, и есть метод GetEnumerator().Первый мне почему-то не доступен(ну нет его в выпадающем списке) он и проще....

По поводу GetEnumerator в два ночи как-то плохо соображается. smile
Используй foreach или for. Чем они тебе не угодили?
Типа так:
Код

using System;
using System.Collections;

class Class1
    {
        static void Main(string[] args)
        {
            ArrayList al = new ArrayList();
            al.Add(555);
            al.Add(777);

            Console.WriteLine("Using foreach:");
            foreach(int a in al)
            {
                Console.Write(a+" ");
            }
            Console.WriteLine();
            Console.WriteLine("Using for:");
            for(int i=0; i<al.Count; i++)
            {
                Console.Write(al[i]+" ");
            }
            Console.ReadLine();
        }
    }

Кстати, использование foreach с коллекциями именно в MSDN и описано.. smile

Цитата
Так может "хотя" обсудим?

Ну, как я слышал, типа не инициализировать поля - плохой стиль. Вдруг ты чего забудешь и не выполнишь
Код

s.rect=new Rectangle(6,7,5,6);

- вывалишься в Exception при обращении к неинициализированному полю.


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Coocky
Дата 28.5.2005, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата
s.rect=new Rectangle(6,7,5,6);
- вывалишься в Exception

Вываливался, но потом разбирался smile
Цитата
Кстати, использование foreach с коллекциями именно в MSDN и описано

Да..Еще есть вариант, который я использовал..Но
Есть же в описании ArrayList Item?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Kurt
Дата 28.5.2005, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


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

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



Цитата
Есть же в описании ArrayList Item?

Читаем в MSDN (есессно, в описании класса ArrayList):
Цитата
Item - Gets or sets the element at the specified index.
In C#, this property is the indexer for the ArrayList class.

Отсюда видно, что Item в C# - это индексатор. Для доступа к конкретному элементу используется индекс, "квадратные скобки".
Чтоб окончательно удостовериться, кликнем по слову "Item" в MSDN-описании:
Цитата

[Visual Basic]
Public Overridable Default Property Item( _
   ByVal index As Integer _
) As Object  Implements IList.Item

[C#]
public virtual object this[
   int index
] {get; set;}

[C++]
public: __property virtual Object* get_Item(
   int index
);
public: __property virtual void set_Item(
   int index,
   Object*
);


Т.е. "al[i]" - это и есть твой Item. (в C#)


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Coocky
Дата 28.5.2005, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Kurt
Спасибо, видать за недельку еще не расчихлился в новом МСДН.
Иди спать уже, достал я тебя smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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