Метод MemberwiseClone
Защищённый метод MemberwiseClone класса
Object создаёт поверхностную
копию: копируются значения полей, а ссылочные
поля указывают на те же объекты. Вызывают
его из метода своего класса, наследующего
Object.
Синтаксис
(object)MemberwiseClone()
Пример
Давайте скопируем объект с целочисленным полем:
using System;
class Item
{
public int Num;
public Item CloneCopy()
{
return (Item)MemberwiseClone();
}
}
class Program
{
static void Main()
{
var a = new Item { Num = 5 };
var b = a.CloneCopy();
b.Num = 10;
Console.WriteLine(a.Num);
}
}
Результат выполнения кода:
5
Пример
Давайте проверим, что копия - другой экземпляр:
using System;
class Item
{
public int Num;
public Item CloneCopy()
{
return (Item)MemberwiseClone();
}
}
class Program
{
static void Main()
{
var a = new Item { Num = 5 };
var b = a.CloneCopy();
Console.WriteLine(ReferenceEquals(a, b));
}
}
Результат выполнения кода:
False
Пример
Давайте скопируем поле bool вместе с int:
using System;
class Flags
{
public int Num;
public bool On;
public Flags CloneCopy()
{
return (Flags)MemberwiseClone();
}
}
class Program
{
static void Main()
{
var a = new Flags { Num = 5, On = true };
var b = a.CloneCopy();
Console.WriteLine(b.On);
}
}
Результат выполнения кода:
True
Пример
Давайте покажем, что ссылочное поле общее при мелком клоне:
using System;
class Holder
{
public string Text;
public Holder CloneCopy()
{
return (Holder)MemberwiseClone();
}
}
class Program
{
static void Main()
{
var a = new Holder { Text = "abcde" };
var b = a.CloneCopy();
Console.WriteLine(ReferenceEquals(a.Text, b.Text));
}
}
Результат выполнения кода:
True
Смотрите также
-
метод
ReferenceEquals,
который проверяет совпадение ссылок -
метод
Equals,
который сравнивает содержимое -
класс
Object,
который объявляет MemberwiseClone -
тип
object,
к которому приводят результат клона