2013-07-21 4 views
0

У меня есть эта строка кода:Изменение свойств объекта влияет на изменение свойства объекта B

SomeClass a = new SomeClass(); 
SomeClass b = a; 
a.price = 15; 
b.price = 20; 

Console.WriteLine(a.price); // output 20 

Сначала я создаёте объект, а затем объект B. Для объекта b я назначил объект a. Когда я инициализирую цену собственности для этого объекта, так как вы можете видеть, что цена объекта a равна 15, а b равна 20. Но когда вы назначаете 20 цене объекта b, в то же время изменения будут влиять на цену объекта a. Почему?

Я имею в виду, что происходит в памяти, чтобы вызвать это?

+0

объект б представляет собой ссылку на объект а, указатель, если вы знаете, указатели, так что если а или б изменение другого отражает изменение – MEYWD

+0

@MEYWD: 'b' не является объектом вообще. Это * переменная *. Значение 'b' совпадает с значением' a' - оба являются ссылками на один и тот же объект. Очень важно различать понятия переменных, ссылок и объектов. Изменение значения 'a' (для обращения к другому объекту) * * не сделает ничего с значением' b'. Это только изменение объекта, на которое они ссылаются, и это отражено. –

+0

@JonSkeet Вы правы, я просто хотел объяснить это в простой форме, а по объекту i означал переменную. – MEYWD

ответ

1

SomeClass является ссылочным типом (объявлено классом SomeClass { ... }). a и b ссылка тот же экземпляр класса (тот, вы создаете с new SomeClass(). Это означает, что указывает на тот же экземпляр (затем к тому же элемента памяти).

Чтобы иметь поведение, которое вы хотите у вас есть использовать тип значения (объявленный с структурой SomeStruct { ... })

+0

Да, когда я меняю ** класс ** на ** struct **, это не так. Спасибо. – zajke

+0

Однако будьте осторожны с структурами. Поскольку выполнение 'b = a' будет дублировать память' a' на 'b' (даже вызывая метод с параметром' a', будет дублировать его). Таким образом, не создавайте большие структуры. См. [Using structs] (http://msdn.microsoft.com/en-us/library/0taef578.aspx). –

+0

Хорошо. Спасибо за совет. :-) – zajke

0

Это основное различие между ValueType и ReferenceType

с ValueType единого пространством в памяти выделяются для хранения значения (Пример:... INT, BOOL , char - типы значений).

С ReferenceType объект создается в памяти, а затем обрабатывается через отдельную ссылку - скорее, как указатель. Эта ссылка ответственна за изменение значения предыдущего объекта. More here

Смежные вопросы