Поскольку Person
является ссылочным типом, когда вы делаете person2 = current;
, вы на самом деле просто указываете ссылку person2
на объект current
в памяти, на который также указывает person
.
Таким образом, любые изменения, сделанные с помощью одной ссылки, изменят тот же физический объект в памяти, что и любые изменения, сделанные с помощью другой ссылки.
Вам необходимо сделать фактическую копию объекта.
Один из распространенных способов сделать это - написать "Конструктор копирования" для создания копии. Вы также можете написать метод Copy()
, который использует конструктор копирования для реализации, но в этом нет необходимости, если у вас нет иерархии наследования.
Вот как ваш класс Person
будет выглядеть с конструктором копирования и (для полноты) метод Copy()
:
public class Person
{
private string _name;
public Person() // Default constructor is required if there are any other constructors!
{
Name = "";
}
public Person(Person other) // Copy constructor.
{
this.Name = other.Name;
}
public Person Copy()
{
return new Person(this); // Use copy constructor to return a copy of this.
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public void Change()
{
Name = "F";
}
}
Затем вы можете использовать это для примера:
static void Main()
{
Person person = new Person();
Person person2 = new Person();
Person current = new Person();
person.Name = "John";
person2.Name = "Doe";
current.Name = "Robert";
person = new Person(current); // Using Copy Constructor.
person2 = current.Copy(); // Using Copy() method.
current.Change(); // Only changes current, not person or person2.
}
Примечание. реализовать метод Copy()
и просто придерживаться конструктора копирования, если (как отмечалось ранее) не существует иерархии наследования для вашего класса. Это было бы расширенное использование вне рамок этого ответа !