Страницы

Поиск по вопросам

вторник, 27 ноября 2018 г.

Перегрузка оператора присваивания c#

Здравствуйте, на паре форумов прочитал, что перегрузить этот оператор невозможно. Как решить эту проблему? '
{ public static void operator = (Person p, Person p1); }`
Просто если использовать ArrayList.Colone(), то изменяя новую коллекцию я изменяю и исходную, как это возможно избежать? Спасибо за внимание, подскажите куда копать.


Ответ

Оператор присваивания, как и некоторые другие действительно нельзя переопределить (см. MSDN). Но если у вас есть доступ к исходникам класса Person, то для решения вашей задачи достаточно унаследовать класс Person от интерфейса IClonable и реализовать этот интерфейс примерно так:
public class Person : IClonable { // тут ваши поля и методы
public object Clone() { var personClone = new Person(); //тут копируем в новую сущность нужные свойства return personClone; } }
После этого вы совершенно спокойно можете копировать элементы, например так:
Person p1 = new Person() { //присвоили значения полям }
Person p2 = p1.Clone();
В этом случае, p2 получит новую ссылку на свой собственный объект Person. Правда копировать коллекцию придется вручную поэлементно в цикле, т.к. реализованный у стандартных коллекций метод Clone делает неполное копирование и в случае элементов ссылочного типа - копирует ссылки. Но на этот случай можно предусмотреть статический метод в классе Person получающий на вход коллекцию и возвращающий ее копию.

Комментариев нет:

Отправить комментарий