Skip to content

Глибоке копіювання об’єктів [C#]

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Завантаження...

[ Полезный рекламный блок ]

Попробуйте свои силы в игре, где ваши навыки программирования на C# станут решающим фактором. Переходите по ссылке 🔰.


У C# клонування об’єкта означає створення його копії. Однак існує два типи клонування: неглибоке клонування і глибоке клонування.

Під час неглибокого клонування створюється новий об’єкт, який є копією вихідного об’єкта, але вміст копії, як і раніше, вказує на ті самі об’єкти, що й оригінал. Це означає, що зміни, внесені у властивості копії, також вплинуть на оригінал.

Глибоке клонування, з іншого боку, створює новий об’єкт, який є копією оригіналу, але вміст копії також копіюється, тому два об’єкти не мають спільних посилань. Це означає, що зміни, внесені у властивості копії, не вплинуть на оригінал.

У C# існує кілька способів глибокого клонування об’єкта, включно з реалізацією інтерфейсу ICloneable, використанням серіалізації та десеріалізації, а також використанням сторонніх бібліотек, таких як AutoMapper, Newtonsoft.Json або BinaryFormatter.

Серіалізації та десеріалізація

Один із поширених підходів – використання серіалізації та десеріалізації. Ось приклад:

У цьому прикладі ми визначаємо простий клас MyClass, який має дві властивості: Number і Text. Потім ми створюємо екземпляр MyClass і серіалізуємо його в потік пам’яті за допомогою BinaryFormatter. Ми скидаємо позицію потоку на початок, а потім десеріалізуємо об’єкт назад у новий екземпляр MyClass під назвою copy. Нарешті, ми змінюємо властивості копії та перевіряємо, що властивості оригіналу залишилися незмінними.

Використання серіалізації та десеріалізації передбачає серіалізацію вихідного об’єкта в потік байтів, а потім його десеріалізацію назад у новий об’єкт. Цей підхід може бути повільнішим, ніж інші методи, але він часто простіший у реалізації.

Реалізація інтерфейсу ICloneable

Для початку розглянемо приклад не глибокого клонування:

Використання:

Тепер приклад із глибоким клонуванням:

Або можна зробити так:

Використання:

 

 

Published inВідповіді на запитання C#
Subscribe
Notify of
guest
0 комментариев
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x