Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464

Поясните пожалуйста построчно этот код - создание клона через MemberwiseClone

21.05.2018, 12:49. Показов 2905. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет.
Столкнулся с подлянкой указателей при копировании элементов списка (кастомный класс).

Нашел вот это решение:
C#
1
2
3
4
5
6
7
8
9
10
11
static T CreateCopy<T>(T aobject)
{
    MethodInfo memberwiseClone = aobject.GetType().GetMethod("MemberwiseClone", BindingFlags.Instance | BindingFlags.NonPublic);
    T Copy = (T)memberwiseClone.Invoke(aobject, null);
    foreach (FieldInfo f in typeof(T).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
    {
        object original = f.GetValue(aobject);
        f.SetValue(Copy, CreateCopy(original));
    }
    return Copy;
}
Оно работает, копия создается правильно.

Но просто тупо использовать код как-то не хочется, хотелось бы понять его работу. Может кто-нибудь пояснить построчно? Мне даже вот это T CreateCopy<T>(T aobject) непонятно...что за Т, что за Аобджект, почему CreateCopy<T>...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.05.2018, 12:49
Ответы с готовыми решениями:

Пожалуйста поясните, что делает этот кусок кода .Invoke(this, new EventArgs();
Привет всем, нужна подсказка по начиная со строки 26 и далее. То, что метод OnValueCheckedUp регулярно вызывается, -это понятно. ...

Поясните, что делает этот код с использованием указателей
Пытаюсь понять чужой код, который нашел в сети, там есть такое: type PListEntry32 = ^TListEntry32; TListEntry32 = packed...

поясните пожалуйста код
#include &lt;iostream.h&gt; #include &lt;fstream.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;iomanip.h&gt; ...

45
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,046
22.05.2018, 09:20
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от PowerCat Посмотреть сообщение
я правильно понимаю, что копия создается автоматом в конструкторе в момент создания экземпляра класса? Т.е. не надо потом заботиться о том, чтобы избавиться от ссылок?
На чём основана данная догадка?
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
22.05.2018, 09:23  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
На чём основана данная догадка?
Ну как - созданием занимается конструктор, значит он возвращает копию экземпляра...
Хотя получается какая-то фигня...не пока не понял, как это применить
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,046
22.05.2018, 09:26
PowerCat, конструктор отвечает за создание текущего экземпляра класса и всё. Вы ввели отдельный метод Clone() (Клонировать) вызов которого возвращает копию объекта. Какая тут связь с конструктором?
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
22.05.2018, 09:29  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
PowerCat, конструктор отвечает за создание текущего экземпляра класса и всё. Вы ввели отдельный метод Clone() (Клонировать) вызов которого возвращает копию объекта. Какая тут связь с конструктором?
Так...что-то не понял. Получилось что-то типа, что метод Клон возвращает экземпляр класса, в котором сидит?
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,046
22.05.2018, 09:31
PowerCat, нет, блин, он возвращает копию сделанную из текущего экземпляра!
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
22.05.2018, 10:04  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
PowerCat, нет, блин, он возвращает копию сделанную из текущего экземпляра!
Спокойствие, только спокойствие!
Я понимаю, что возвращает копию. Только выглядит это как рекурсия.
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,046
22.05.2018, 10:06
PowerCat, откуда тут рекурсия?
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
22.05.2018, 10:14  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
PowerCat, откуда тут рекурсия?
Это рекурсия? Метод вызывает сам себя...
C#
1
2
3
4
5
6
7
Class A
{
     metod_1()
     {
          metod_1();
     }
}
А вот это очень похоже...Тип возвращаемого значения - как у класса, в котором возвращающий метод сидит.
C#
1
2
3
4
5
6
7
8
     public class Class_quarter
     {
          public Class_quarter Clone()//Вот эта строка очень похожа
          {
               return this.MemberwiseClone() as Class_quarter;
          }
 
     }
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,046
22.05.2018, 10:18
Цитата Сообщение от PowerCat Посмотреть сообщение
Это рекурсия? Метод вызывает сам себя...
Да.

Цитата Сообщение от PowerCat Посмотреть сообщение
А вот это очень похоже...
Вообще никакого сходства.
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
22.05.2018, 10:20  [ТС]
Обе конструкции работают с тем, в чем сами сидят.
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,046
22.05.2018, 10:24
PowerCat, и что?

Добавлено через 3 минуты
Получается, что любой метод, который обращается к полям экземпляра класса - рекурсия?
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
22.05.2018, 10:32  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Получается, что любой метод, который обращается к полям экземпляра класса - рекурсия?
Не к полям, а возвращает свой же класс...т.е. сидит в классе, и его же возвращает...
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,046
22.05.2018, 10:33
PowerCat, во-первых, возвращается ссылка на новый объект, во-вторых, даже если вернуть ссылку на самого себя, то какая связь тут с рекурсией?
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
22.05.2018, 10:34  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
на самого себя
Чем не рекурсия? Да я и говорил, что похоже на рекурсию, а не именно она ))
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,046
22.05.2018, 10:35
Цитата Сообщение от PowerCat Посмотреть сообщение
Чем не рекурсия?
Вообще ничем. Никакого намёка, даже туманного.
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
22.05.2018, 10:42  [ТС]
Реку́рсия — определение, описание, изображение какого-либо объекта или процесса внутри самого этого объекта или процесса, то есть ситуация, когда объект является частью самого себя.

Внутри класса А работает метод, который возвращает класс А...вроде формально вписывается в определение.
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,046
22.05.2018, 10:44
PowerCat, нет, никакой связи. Тут создаётся новый объект, просто того же типа. И даже, если бы возвращалась ссылка на себя (this), то рекурсией тоже не пахло бы.
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
22.05.2018, 10:51  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
PowerCat, нет, никакой связи. Тут создаётся новый объект, просто того же типа. И даже, если бы возвращалась ссылка на себя (this), то рекурсией тоже не пахло бы.
Ну может это и не рекурсия...тут явно тебе виднее.
Один хрен, штука работает. Благодарю.

Однако к первоначальной теме - построчной рефлексии?
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,046
22.05.2018, 11:05
Цитата Сообщение от PowerCat Посмотреть сообщение
Однако к первоначальной теме - построчной рефлексии?
В ней есть необходимость?
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
22.05.2018, 11:09  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
В ней есть необходимость?
Только вчера узнал о таком явлении - хотелось бы понимать:
1. Для чего она;
2. И построчное объяснение...жесткой необходимости, разумеется, теперь нет, так что некритично.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.05.2018, 11:09

Поясните пожалуйста код
Код принимает число и возвращает его английское название. поясните пожалуйста выделенное красным. def englishNumber number if...

Поясните пожалуйста код
Здравствуйте. Завтра нужно сдавать программу, а выяснилось что мне нужно знать что означает каждая строка следующего кода: function...

Поясните пожалуйста код
Надо вывести числа в заданном диапазоне с шагом в 0.01. for (float x = 0; x &gt; -0.15 ; x -= 0.01) { ...

Поясните пожалуйста код . . .
я делаю базу данных о загрязнении воздушной среды. . . Всю основу я сделала. . .но не понимаю . . у меня есть задание вывести учет...

Пожалуйста, поясните код программы.
Добрый день уважаемые форумчане! У меня есть к вам просьба, сам я учу Си++, и поэтому в Паскале не разбираюсь. Поясните пожалуйста подробно...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru