2013-07-21 124 views
0

的属性我有这行代码:改变A对象的属性影响的改变B对象

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

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

首先创建对象A,然后对象b。为了对象b我分配了对象a。当我将财产价格初始化为这些对象时,您可以看到对象a的价格为15,而b的价格为20.但是,当您将对象b的价格指定为20时,同时时间的变化将会影响对象a的价格。 为什么?

我的意思是在内存中发生什么事情导致这种情况?

+0

对象B是一个对象的引用,指针,如果你知道的指针,因此,如果A或B换另一体现了变化 – MEYWD

+0

@MEYWD:'B'不是一个对象都没有。这是一个*变量*。 “b”的值与“a”的值相同 - 都是对同一对象的引用。区分变量,参考和对象的概念非常重要。改变'a'的值(以引用不同的对象)将不会对'b'的值做任何事情。这只是对对象的一种改变,它们都指代了这一点。 –

+0

@JonSkeet你是对的,我只是想以简单的形式解释它,而我的意思是变量。 – MEYWD

回答

1

SomeClass是参考类型(用类SomeClass { ... }声明)。 的ab参考类(你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

这是ValueTypeReferenceType之间的基本差异

随着值类型在存储器中的单个空间分配给存储该值(例:。INT,布尔,char是值类型)

使用ReferenceType在内存中创建一个对象,然后通过单独的引用进行处理 - 而非像一个指针。该引用负责更改前一个对象的值。 More here