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

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

07.10.2013, 17:25. Показов 18201. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2013, 17:25
Ответы с готовыми решениями:

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

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

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

19
53 / 53 / 16
Регистрация: 25.02.2013
Сообщений: 171
07.10.2013, 17:30
они имеют одну ссылку по этому и меняются
1
192 / 192 / 29
Регистрация: 03.12.2009
Сообщений: 853
07.10.2013, 17:30
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  [ТС]
Спасибо, стало понятно в чем проблема, но решение не помогло, изменения по-прежнему происходит в обоих списках. Прямое копирование элементов одного списка в другой также не помогло
C#
1
2
3
4
foreach (var p in steps)
{
CurrSit.Add(p);
}
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
07.10.2013, 18:00
Lazy Mashka, вы все равно копируете всего лишь ссылку, а не весь объект.
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
07.10.2013, 18:03
должно быть нечто вроде

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  [ТС]
Вопрос решен, всем спасибо)
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
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.10.2013, 19:04
kolorotur, кстати, к вам вопрос, как к специалисту - почему в шарпе не сделали конструктор копирования? Очень удобная штука ведь. И часто её не хватает, как раз в таких случаях.


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

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

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

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

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

Цитата Сообщение от kolorotur Посмотреть сообщение
Вот это жопа
Держитесь!
да ладно, бывает у людей и хуже)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.10.2013, 14:42
Цитата Сообщение от Psilon Посмотреть сообщение
насколько я помню, блок синхронизации имеет смещение -4 и поэтому не учитывается при копировании, да и не входит в размер объекта.
Дык я же не про объект CLR говорю, а про что-то вроде этого, но вашей собственной реализации на шарпе:
Цитата Сообщение от kolorotur Посмотреть сообщение
Вот пишите вы, допустим, на шарпе какую-нибудь виртуальную машину наподобие CLR...
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.10.2013, 15:00
kolorotur, ну не учитывать естественно
0
192 / 192 / 29
Регистрация: 03.12.2009
Сообщений: 853
08.10.2013, 15:52
Цитата Сообщение от 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
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
08.10.2013, 16:11
da1z, steps - это List<T>, а лист реализует интерфейс IEnumerable<T>, а значит по нему можно пробегать с помощью foreach. Преобразование в массив излишне.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.10.2013, 16:14
tezaurismosis, смотря что ему нужно.
0
192 / 192 / 29
Регистрация: 03.12.2009
Сообщений: 853
08.10.2013, 16:20
Это для того чтобы элементы скопировались, а не ссылки.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
08.10.2013, 16:43
da1z, тогда и в массиве будут ссылки, ведь массив - ссылочный тип.
0
192 / 192 / 29
Регистрация: 03.12.2009
Сообщений: 853
08.10.2013, 17:07
Точно, что-то я ступил
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.10.2013, 17:07
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru