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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приведение к моему типу. Object -> Мой тип. 
V
    Опции темы
iddqd
Дата 6.3.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

    public class ClientInfo
    {
        public string ClientId;
        public Socket handle;
        static int BufferMaxSize = 1024;
        byte[] Buffer = new byte[BufferMaxSize];
    }

    public class GTClient
    {
        private static ArrayList data = new ArrayList();

        public object this[int idx]
        {
            get { return data[idx]; }
        }

        public void Add(ClientInfo client)
        {
            data.Add(client);                                        
        }
    }


Пытаюсь использовать вот так:
Код

            ClientInfo bb = new ClientInfo();
            bb.ClientId = "123";

            GTClient l = new GTClient();
            l.Add(bb);
            l.Add(bb);
            l.Add(bb);
            bb.ClientId = "3333333";
            bb = (ClientInfo)l[2];
            l.Add(bb);

В последней строке у bb не изменилось значение. Как сделать нормальное приведение типа, чтоб все поля переносились?
Или может быть предложите другую реализацию класса?


--------------------
PM MAIL   Вверх
Idsa
Дата 6.3.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Несмотря на то, что, казалось бы, ты сохраняешь в ArrayList объект, на самом деле ты сохраняешь ссылку на объект. Поэтому нецелесообразно сохранять одну и ту же ссылку несколько раз (это так, к слову). 
Меняя значение ClientId, ты меняешь его в объекте bb. А все хранимые тобой в ArrayList ссылки ссылаются на этот объект. Т. е. потом, при извлечении этих "объектов" (фактически, ссылок на bb) они будут ссылать на "обновленный" bb, соответственно предыдущее значение будет безвозвратно потеряно. 
Для того чтобы избавиться от ошибки можно, например, создавать новый объект:
Код

ClientInfo bb = new ClientInfo();
bb.ClientId = "123";
ClientInfo bbb = new ClientInfo();
bbb.ClientId = "3333333";
    
GTClient l = new GTClient();
l.Add(bb);
l.Add(bbb);

В этом случае мы храним две ссылки на разные объекты, и изменение ClientId в одном объекте не повелечет изменения ClientId в другом (и наоборот).


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Wanderer2019
Дата 6.3.2007, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Честно говоря мало что понял из написанного... 

Цитата(iddqd @  6.3.2007,  16:02 Найти цитируемый пост)
            
ClientInfo bb = new ClientInfo();
            bb.ClientId = "123";
            GTClient l = new GTClient();
            l.Add(bb);
            l.Add(bb);
            l.Add(bb);
            bb.ClientId = "3333333";
            bb = (ClientInfo)l[2];
            l.Add(bb);

Вообще то код компилится без ошибок, но вот логики нет совсем...
Сначала ты создаешь объект bb... Далее ты инициализируешь поле ClientID. Затем создаешь объект типа GTClient (кстати поля класса положено инициализировать в конструкторах). Далее 3 раза добавляешь в список ссылку на 1-н и тот же обхект... Затем изменяешь значение поля этого объекта (соответственно это значение меняется и у уже "добавленных обхекто").  В конце концов ты кладешь в bb его же самого и добавляешь еще 1 раз....
Что ты пытался сделать????

PM ICQ MSN   Вверх
Stepan_Lameroff
Дата 6.3.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Если пишете на FW2.0, то можно сделать типа такого:

Код

    public class ClientInfo
    {
        public string ClientId;
        public Socket handle;
        static int BufferMaxSize = 1024;
        byte[] Buffer = new byte[BufferMaxSize];
    }

    public class GTClient : List<ClientInfo>
    {
        public ClientInfo this[string clientId]
        {
            get
            {
                return Find(delegate(ClientInfo info)
                                {
                                    if (info.ClientId == clientId)
                                        return true;

                                    return false;
                                });
            }
            set
            {
                int idx = FindIndex(delegate(ClientInfo info)
                                        {
                                            if (info.ClientId == clientId)
                                                return true;

                                            return false;
                                        });
                if(idx >= 0)
                    this[idx] = value;
            }
        }
    }

PM MAIL   Вверх
iddqd
Дата 6.3.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А вроде всё понятно расписал.
Суть в следующем, мне надо сделать индексатор для класса GTClient, который будет возвращать объект, типа мой класс  ClientInfo.


--------------------
PM MAIL   Вверх
bend0r
Дата 6.3.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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




хмм.а явное преобразования не подходит?
кпримеру
Код

for (int i = 0; i < 4; i++)
{
        Console.WriteLine(((ClientInfo)l[i]).ClientId);
}

PM MAIL   Вверх
iddqd
Дата 6.3.2007, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Подходит. Проблемы с ссылочностью появляются. Нельзя просто как-то иначе реализовать класс и индексатор?


--------------------
PM MAIL   Вверх
Stepan_Lameroff
Дата 6.3.2007, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Если Вас не устраивает Generic реализация(причины могут быть разные   smile ), то вот изчо вариант:
Код

    public class GTClient : CollectionBase
    {
        public ClientInfo this[int index]  
        {
            get  
            {
                return( (ClientInfo) List[index] );
            }
            set  
            {
                List[index] = value;
            }
        }
        
        public ClientInfo this[string clientId]  
        {
            get  
            {
                return( (ClientInfo)List[IndexOf(clientId)] );
            }
            set  
            {
                List[IndexOf(clientId)] = value;
            }
        }

        public int Add( ClientInfo value )  
        {
            return( InnerList.Add( value ) );
        }

        public int IndexOf( ClientInfo value )  
        {
            return( List.IndexOf( value ) );
        }

        public int IndexOf( string clientId )  
        {
            int count = InnerList.Count;
            for(int i = 0; i < count; ++i)
            {
                ClientInfo info = (ClientInfo)InnerList[i];
                if(string.Compare(info.ClientId, clientId, true) == 0 )
                    return i;
            }
            return -1;
        }

        public void Insert( int index, ClientInfo value )  
        {
            InnerList.Insert( index, value );
        }

        public void Remove( ClientInfo value )  
        {
            List.Remove( value );
        }

        public bool Contains( ClientInfo value )  
        {
            return( List.Contains( value ) );
        }

        protected override void OnValidate( Object value )  
        {
            if (!(value is ClientInfo) )
                throw new ArgumentException( "Value must be of type ClientInfo.", "value" );
        }
    }

PM MAIL   Вверх
iddqd
Дата 7.3.2007, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Stepan_Lameroff, гениально! smile
+1


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

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


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

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


 




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


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

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