引用类型:将一个对象传递给多个类?

时间:2013-06-17 15:05:16

标签: c# reference pass-by-reference

我正试图围绕引用类型的行为。我的理解是类是引用类型。假设我有一个带有MyObject类型作为参数的构造函数的类。如果我将相同的MyObject实例传递给两个类,然后在一个类中修改它,我是否能够看到这两个类中的更改?例如:

MyObject myObject = new MyObject();
MyClass myClass1 = new MyClass(myObject);
MyClass myClass2 = new MyClass(myObject);

myClass1.myObject.Name = "Joe";

如果我引用myClass2.myObject.Name会反映对myClass1.myObject.Name所做的更改吗?

5 个答案:

答案 0 :(得分:4)

不,因为你只是覆盖了myClass1.myObject的引用,而不是它的内容。

编辑:是的,当您改变myClass1时,例如更改Name属性,但不会覆盖myClass1的引用。

答案 1 :(得分:1)

您只创建了myObject的一个实例,所以会发生两个类都指向同一个事情:

enter image description here

无论您如何访问它,您总是修改同一个对象:

myClass1.myObject.Name = "Example"
myClass2.myObject.Name == "Example" //true

答案 2 :(得分:1)

是的,只要你这样使用它。如果MyObject是class,而不是struct

    MyObject myObject = new MyObject();
    MyClass myClass1 = new MyClass(myObject);
    MyClass myClass2 = new MyClass(myObject);

    myClass1.myObject.Name = "Joe";

答案 3 :(得分:1)

将引用类型视为保存“对象ID”,并将表达式“someReference.DoSomething()”视为“查找ID为 _ _的对象”,并执行DoSomething( )方法“;像“reference1 = reference2”这样的语句表示将存储在reference2中的对象ID复制到reference1中。请注意,第一个语句不会修改someReference;如果在执行之前它持有“对象id#8675309”,它将继续这样做之后。另请注意,第二个语句不会修改reference1引用的对象,也不会修改reference2过去引用的任何对象。

在.NET语言中,对象引用实际上可以做的事情很少;涉及参考类型成员的任何事情[例如myCar.Color = Blue;]不会对引用类型的存储位置起作用,而是会对ID存储在该位置的对象进行操作。

值得注意的是,值类型与引用类型的工作方式不同。原始值类型的存储位置(例如Int32)实际上保持一个值;结构类型的存储位置(例如Drawing.Point)包含该类型的所有实例字段(无论是公共字段,内部字段还是私有字段)。将一个值类型存储位置复制到另一个值将使用从第一个值中获取的值覆盖目标的所有字段,并且访问值类型的成员将实际访问存储在其中的字段。

有些人认为允许编写如下代码是邪恶的:

Point myPoints[1000];
myPoints[0] = startPosition;
myPoints[1] = startPosition;
myPoints[0].X += 4;

将修改myPoint[0]中的部分数据,同时保留startPosition的所有其他副本不受影响。这种行为与类对象的行为非常不同,一个人肯定需要注意它,但它本身也是非常有用的。

答案 4 :(得分:-1)

您的类包含2个关于单个对象的引用

MyObject myObject = new MyObject();
MyClass myClass1 = new MyClass(myObject);
MyClass myClass2 = new MyClass(myObject);

如果你将一些属性改为myObject,那么myClass2和myClass1也会改变这种状态。

myObject.myProperty=1;

myClass2.myObject.myProperty==1
myClass1.myObject.myProperty==1

您可以更改一个班级的参考

myClass2.myObject=GetNewMyObject();
myClass2.myObject.myProperty==2;

所以你会看到

myClass2.myObject.myProperty==2
myClass1.myObject.myProperty==1