2015-07-24 3 views
1

У меня есть 2 объекта того же класса, что и в C#.Как остановить ссылку на другой объект класса?

Myclass obj1 = new Myclass(); 
Myclass obj2 = null; 
obj2 = obj1; 
obj1.Name = "abc";  //"abc" will also assign to obj2.Name. 

Когда я задаю obj1.Name="abc", он также будет назначать obj2.Name. Я хочу остановить это. Я попробовал const, запечатанный, но я не получаю результата. Может ли кто-нибудь предложить мне, как остановить ссылку obj1 на obj2?

+0

Вы должны создать новый экземпляр MyClass из 'obj2' прекратить ссылки из' obj1'. –

+1

Потому что 'obj1' и' obj2' указывают одни и те же объекты. Как насчет _not_ присваивать свои ссылки друг другу? –

+1

[Клонировать его как-то.] (Https://msdn.microsoft.com/en-us/library/system.icloneable (v = vs.110) .aspx) – Ryan

ответ

3

Вы хотите глубоко клоном obj1:

Myclass obj1 = new Myclass(); 
Myclass obj2 = DeepClone(obj1); 
obj1.Name = "abc"; 

Один из способов глубокого клона объект должен сериализовать его и Deserialize его обратно.

Вот пример использования Json.NET:

public T DeepClone<T>(T instance) 
{ 
    return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(instance)); 
} 
0

Когда вы пишете obj2 = obj1, вы делаете obj2 указывают на объект, который obj1 указывает на. Вы не создаете новый отдельный экземпляр с таким же значением, как obj1. Поэтому для того, чтобы предотвратить любые изменения, внесенные в obj1 появляются в obj2, что вам нужно сделать глубокую копию obj1, как следующее:

obj2 = new MyClass(obj1); 
obj1.Name = "abc"; 
1

вы видите поведение, потому что вы просто две ссылки к одному объекту. Неважно, какую ссылку вы используете для получения объекта, это все тот же объект. Я предполагаю, что это потому, что MyClass является ссылочным типом (то есть a class).

Так как кажется, вы хотите семантику типа значение здесь, возможно, вы хотите MyClass быть struct, так что копия создается по заданию:

struct MyClass 
{ 
    private string _name; 
    public MyClass(string name) 
    { 
     _name = name; 
    } 

    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 
} 

Тогда исходный код работает, как вы хотели:

MyClass joe = new Myclass("Joe"); 
MyClass bob = joe; 
bob.Name = "Bob"; 

Console.WriteLine(bob.Name); // Bob 
Console.WriteLine(joe.Name); // Joe 

в действии здесь: http://ideone.com/Xwnqsa

1

Вы должны кло ne obj1. Вы можете использовать MemberwiseClone().

Myclass obj2 = (Myclass)obj1.MemberwiseClone(); 
+0

Должен ли я удалить свой [ответ] (http://stackoverflow.com/a/31603861/1020470)? –

+0

Нет, вам не нужно удалять ответ. Ваш ответ более показателен. – pars2307

+0

Я думаю, что вы должны положить отказ в том, что этот метод делает мелкую копию, иначе люди могли бы принять иное. –

2

см. Мой комментарий выше. Окна msdn docs for MemberwiseClone покрывают эту скважину.

в MyClass добавить следующий метод:

public class MyClass 
{ 
    ... 
    // make a shallow copy 
    public MyClass ShallowCopy() 
    { 
     return (MyClass) this.MemberwiseClone(); 
    } 
} 

, то вы можете использовать ShallowCopy() метод для создания obj2

Myclass obj1 = new Myclass(); 
Myclass obj2 = obj1.ShallowCopy(); 
obj1.Name = "abc";  //"abc" won't assign to obj2.Name. 
Смежные вопросы