Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Конструктор копирования

18K
22 ноября 2006 года
xxx-lexus
11 / / 22.11.2006
У меня есть достаточно громоздкий класс. Можно ли как-то побитово скопировать все его члены? Мне очень лень копировать все члены этого класса.
Я попробовал через сериализацию в MemoryStream, но там SerializationException
Как мне поступить?
273
23 ноября 2006 года
3A3-968M
1.2K / / 22.12.2005
Вот решение:
http://forum.codenet.ru/showpost.php?p=154925&postcount=14
18K
23 ноября 2006 года
xxx-lexus
11 / / 22.11.2006
Не, не работает. Строки не копирует и некоторые другие элементы тоже не так как надо :-(
273
23 ноября 2006 года
3A3-968M
1.2K / / 22.12.2005
Цитата: xxx-lexus
Не, не работает. Строки не копирует и некоторые другие элементы тоже не так как надо :-(


Что не работает?? Функция глубокого или поверхностного копирования?? И какое копирование тебе надо??

18K
23 ноября 2006 года
xxx-lexus
11 / / 22.11.2006
По ходу не сработал функция поверхностного копирования для string
273
24 ноября 2006 года
3A3-968M
1.2K / / 22.12.2005
Цитата: xxx-lexus
По ходу не сработал функция поверхностного копирования для string


Так зачем тебе поверхностное копирование??? Тебе нужно глубокое, т.к. поверхностное создаёт новый экземпляр класса, но всего его поля ссылаются на объекты оригинала. Вызывай функцию CreateDeepCopy.

18K
24 ноября 2006 года
xxx-lexus
11 / / 22.11.2006
В глубоком копировании вызывается неглубокое копирование, а потом для всех данных класса вызывается рекурсивно глубокое копирование, где снова сначала делается неглубокое и т.д.
В моем классе есть член типа string. Для него это копирование не сработало.

P.S. Извини, если где-то тупанул, просто я ночь не спал, теперь мучаюсь :-(
273
24 ноября 2006 года
3A3-968M
1.2K / / 22.12.2005
Цитата: xxx-lexus
В глубоком копировании вызывается неглубокое копирование, а потом для всех данных класса вызывается рекурсивно глубокое копирование, где снова сначала делается неглубокое и т.д.
В моем классе есть член типа string. Для него это копирование не сработало.

P.S. Извини, если где-то тупанул, просто я ночь не спал, теперь мучаюсь :-(


Так всё же что не работает?? Ссылки обоих классов ссылаются на одну и ту же строку??? Это не из-за того, что не работает копирование, а из-за того, что CLR не рассматривает одинаковые строки как отдельные экземпляры, а лишь как один. Это хорошо демонстрирует пример:

 
Код:
[SIZE=2][COLOR=#0000ff][FONT=Courier New]static [/FONT][/COLOR][/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]void[/COLOR][/SIZE][SIZE=2] Main([/SIZE][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New][] args)[/FONT][/SIZE]
[SIZE=2][FONT=Courier New]{[/FONT][/SIZE]
[FONT=Courier New][SIZE=2][COLOR=#0000ff] string[/COLOR][/SIZE][SIZE=2] s1 = [/SIZE][SIZE=2][COLOR=#800000]"Hello"[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New];[/FONT][/SIZE]
[FONT=Courier New][SIZE=2][COLOR=#0000ff] string[/COLOR][/SIZE][SIZE=2] s2 = [/SIZE][SIZE=2][COLOR=#800000]"Hello"[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New];[/FONT][/SIZE]
[FONT=Courier New][SIZE=2][COLOR=#008080] Console[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New].WriteLine(s1.Equals(s2));[/FONT][/SIZE]
[FONT=Courier New][SIZE=2][COLOR=#008080] Console[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New].ReadKey();[/FONT][/SIZE]
[SIZE=2][FONT=Courier New]}[/FONT][/SIZE]

Результат будет: true, т.к. s1 и s2 по сути ссылаются на одну и ту же строку. Поэтому поверхностное копирование строки = глубокое копирование строки. На работе обоих классов это никак не отразиться.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог