Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/64: Рейтинг темы: голосов - 64, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 02.10.2011
Сообщений: 3
1

Список объектов класса

07.10.2013, 17:25. Показов 11694. Ответов 19
Метки нет (Все метки)

Здравствуйте)
Проблема такая. Есть класс PossibleStep, создается список объектов этого класса в другом классе
C#
1
2
3
4
5
class Game
{
        
      List<PossibleStep> steps = new List<PossibleStep>();
}
В классе Game есть метод
C#
1
2
3
4
5
 public List<PossibleStep> Make_Move(int x0, int y0, int x, int y)
{
            List<PossibleStep> CurrSit = new List<PossibleStep>();
            CurrSit = steps;
}
Далее в методе происходит изменение элементов списка CurrSit. Так вот, при изменении элементов списка CurrSit, элементы списка steps также меняются. В чем может быть ошибка?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2013, 17:25
Ответы с готовыми решениями:

Добавление объектов класса в массив или список
Доброго времени суток ) Очередной глупый вопрос ! Задача: Есть класс Пользователь. - поле...

Массив объектов базового класса, позволяющий работать с набором объектов — чтение, вывод
Расширить программы с классами. Каждый разработанный класс считать базовым; для каждого такого...

Создание объекта класса, который будет содержать указанное количество объектов другого класса
Здравствуйте. Я сейчас только учусь, помогите, пожалуйста. Задача такая: необходимо создать класс...

Коллекция объектов одного класса в экземпляре другого класса
Извиняюсь, если написал не совсем адекватный заголовок. В общем, у меня есть такая модель: public...

19
53 / 53 / 16
Регистрация: 25.02.2013
Сообщений: 171
07.10.2013, 17:30 2
они имеют одну ссылку по этому и меняются
1
191 / 191 / 29
Регистрация: 03.12.2009
Сообщений: 853
07.10.2013, 17:30 3
C#
1
CurrSit = steps;
здесь не происходит копирование списка, а лишь копируется ссылка на него(или как то так).
как вариант можно сделать так:
C#
1
2
List<PossibleStep> CurrSit = new List<PossibleStep>();
CurrSit.AddRange(steps.ToArray());
1
0 / 0 / 0
Регистрация: 02.10.2011
Сообщений: 3
07.10.2013, 17:51  [ТС] 4
Спасибо, стало понятно в чем проблема, но решение не помогло, изменения по-прежнему происходит в обоих списках. Прямое копирование элементов одного списка в другой также не помогло
C#
1
2
3
4
foreach (var p in steps)
{
CurrSit.Add(p);
}
0
Эксперт .NET
15370 / 11653 / 3056
Регистрация: 17.09.2011
Сообщений: 19,506
07.10.2013, 18:00 5
Lazy Mashka, вы все равно копируете всего лишь ссылку, а не весь объект.
1
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
07.10.2013, 18:03 6
должно быть нечто вроде

C#
1
2
3
foreach (var p in steps){
   CurrSit.Add(p.clone());
}
1
0 / 0 / 0
Регистрация: 02.10.2011
Сообщений: 3
07.10.2013, 18:04  [ТС] 7
Вопрос решен, всем спасибо)
C#
1
2
3
4
5
foreach (var p in steps)
                    {
                        PossibleStep fg = new PossibleStep(p.color, p.x, p.y, p.type);
                        CurrSit.Add(fg);
                    }
0
Master of Orion
Эксперт .NET
6086 / 4942 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.10.2013, 19:04 8
kolorotur, кстати, к вам вопрос, как к специалисту - почему в шарпе не сделали конструктор копирования? Очень удобная штука ведь. И часто её не хватает, как раз в таких случаях.


Lazy Mashka, ты можешь просто вместо class написать struct и тогда можно будет просто написать как в посте #3
0
Эксперт .NET
15370 / 11653 / 3056
Регистрация: 17.09.2011
Сообщений: 19,506
07.10.2013, 20:14 9
Цитата Сообщение от Psilon Посмотреть сообщение
почему в шарпе не сделали конструктор копирования?
Мы же вроде уже в какой-то теме это обсуждали
Ситуация та же, что с клонированием: основная причина — неоднозначность понятия "копирование" в полностью объектно-ориентированном языке. Подразумевается, что это задача разработчика — определять, что именно может являться полноценной копией разрабатываемого им класса.
Ну это так же, как с понятиями равнозначность и иммутабельность: два объекта могут быть равнозначными, хотя побайтовое сравнение занимаемой ими памяти может отличаться, и объект может быть иммутабельным, даже если какие-то из его полей (скрытых от внешних глаз, как правило) и изменяются — в ООП важно то, что видно извне, а не то, что творится в "кишках" объекта.
По этой же причине два объекта могут считаться точными копиями друг друга, даже если и память, ими занимаемая, различается.
Вот и получается, что невозможно сделать некий универсальный метод для создания копии объекта, так как само понятие "копия" в ООП определяется отдельно для каждого типа.

Кстати, разработчики всё-таки не забыли про тех, кто хочет реализовать клонирование/копирование "наивным" методом, но не хочет ручками набивать "this.a = other.a; this.b = other.b": имеется защищенный метод MemberwiseClone, который, по сути, тупо копирует память, занимаемую объектом. А всякие "нюансы" уже потом можно ручками подрихтовать.
1
Master of Orion
Эксперт .NET
6086 / 4942 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.10.2013, 20:20 10
kolorotur, для меня копирование - это копирование всех полей. Не уверен, но вроде нагуглил, что object.MemrerwhiseClone это и делает. Если так - то вопрос снимается: в шарпе есть конструктор копирования, просто он замаскирован под метод основного класса.

Добавлено через 1 минуту
Цитата Сообщение от kolorotur Посмотреть сообщение
Кстати, разработчики всё-таки не забыли про тех, кто хочет реализовать клонирование/копирование "наивным" методом, но не хочет ручками набивать "this.a = other.a; this.b = other.b": имеется защищенный метод MemberwiseClone, который, по сути, тупо копирует память, занимаемую объектом. А всякие "нюансы" уже потом можно ручками подрихтовать.
Мда, чет я как-то сначала пишу, а потом читаю ответ. Прошу понять и простить - отхожу от наркоза, только после операции + расстался с девушкой
0
Эксперт .NET
15370 / 11653 / 3056
Регистрация: 17.09.2011
Сообщений: 19,506
08.10.2013, 11:12 11
Цитата Сообщение от Psilon Посмотреть сообщение
для меня копирование - это копирование всех полей.

Вот пишите вы, допустим, на шарпе какую-нибудь виртуальную машину наподобие CLR, где каждая из ваших базовых единиц (в CLR — объект) состоит из шапки, представленной несколькими полями. Одно из этих полей — блок синхронизации типа int, который при захвате увеличивается, а при освобождении уменьшается.
Если значение равно нулю, то объект свободен, если нет, то объект залочен количеством потоков, равным значению этого поля. Его значение при копировании тоже копировать будем? Ведь если в этот момент его значение не равно нулю, то любая попытка произвести на нем синхронизацию приведет к взаимной блокировке (она же deadlock), т.к. никакой другой поток эту новую копию объекта не захватывал, а следовательно никогда и не освободит.

Цитата Сообщение от Psilon Посмотреть сообщение
отхожу от наркоза, только после операции + расстался с девушкой
Вот это жопа
Держитесь!
1
Master of Orion
Эксперт .NET
6086 / 4942 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.10.2013, 14:10 12
Цитата Сообщение от kolorotur Посмотреть сообщение
Вот пишите вы, допустим, на шарпе какую-нибудь виртуальную машину наподобие CLR, где каждая из ваших базовых единиц (в CLR — объект) состоит из шапки, представленной несколькими полями. Одно из этих полей — блок синхронизации типа int, который при захвате увеличивается, а при освобождении уменьшается.
Если значение равно нулю, то объект свободен, если нет, то объект залочен количеством потоков, равным значению этого поля. Его значение при копировании тоже копировать будем? Ведь если в этот момент его значение не равно нулю, то любая попытка произвести на нем синхронизацию приведет к взаимной блокировке (она же deadlock), т.к. никакой другой поток эту новую копию объекта не захватывал, а следовательно никогда и не освободит.
насколько я помню, блок синхронизации имеет смещение -4 и поэтому не учитывается при копировании, да и не входит в размер объекта.

Цитата Сообщение от kolorotur Посмотреть сообщение
Вот это жопа
Держитесь!
да ладно, бывает у людей и хуже)
0
Эксперт .NET
15370 / 11653 / 3056
Регистрация: 17.09.2011
Сообщений: 19,506
08.10.2013, 14:42 13
Цитата Сообщение от Psilon Посмотреть сообщение
насколько я помню, блок синхронизации имеет смещение -4 и поэтому не учитывается при копировании, да и не входит в размер объекта.
Дык я же не про объект CLR говорю, а про что-то вроде этого, но вашей собственной реализации на шарпе:
Цитата Сообщение от kolorotur Посмотреть сообщение
Вот пишите вы, допустим, на шарпе какую-нибудь виртуальную машину наподобие CLR...
0
Master of Orion
Эксперт .NET
6086 / 4942 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.10.2013, 15:00 14
kolorotur, ну не учитывать естественно
0
191 / 191 / 29
Регистрация: 03.12.2009
Сообщений: 853
08.10.2013, 15:52 15
Цитата Сообщение от Lazy Mashka Посмотреть сообщение
Спасибо, стало понятно в чем проблема, но решение не помогло, изменения по-прежнему происходит в обоих списках. Прямое копирование элементов одного списка в другой также не помогло
C#
1
2
3
4
foreach (var p in steps)
{
CurrSit.Add(p);
}
Нужно так:
C#
1
2
3
4
foreach (var p in steps.ToArray())
{
CurrSit.Add(p);
}
или я не прав?
0
Администратор
Эксперт .NET
9129 / 4405 / 747
Регистрация: 17.04.2012
Сообщений: 9,180
Записей в блоге: 14
08.10.2013, 16:11 16
da1z, steps - это List<T>, а лист реализует интерфейс IEnumerable<T>, а значит по нему можно пробегать с помощью foreach. Преобразование в массив излишне.
0
Master of Orion
Эксперт .NET
6086 / 4942 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.10.2013, 16:14 17
tezaurismosis, смотря что ему нужно.
0
191 / 191 / 29
Регистрация: 03.12.2009
Сообщений: 853
08.10.2013, 16:20 18
Это для того чтобы элементы скопировались, а не ссылки.
0
Администратор
Эксперт .NET
9129 / 4405 / 747
Регистрация: 17.04.2012
Сообщений: 9,180
Записей в блоге: 14
08.10.2013, 16:43 19
da1z, тогда и в массиве будут ссылки, ведь массив - ссылочный тип.
0
191 / 191 / 29
Регистрация: 03.12.2009
Сообщений: 853
08.10.2013, 17:07 20
Точно, что-то я ступил
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2013, 17:07

Передача ссылки на объект класса (массив объектов класса)
Доброго времени, уважаемые форумчане. Прошу прощения за столь глупый вопрос, но правда очень долго...

Поле класса содержит массив объектов другого класса
Добрый день. Есть класс Queue,который как поле содержит массив объектов на класс Pers. public...

Поле класса - массив объектов другого класса
Здравствуйте. У меня определен класс Article, в котором определен конструктор по умолчанию. Затем...

Создание списка объектов класса с заранее неизвестным именем (именем самих объектов)
Уважаемые программисты, не получается решить такую задачу: требуется создать приложение (в консоли)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.