-1

我试图围绕引用类型的行为方式。我的理解是类是引用类型。假设我有一个带有构造函数的类,该构造函数将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

4

5 回答 5

4

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

编辑:是的,当你变异时,myClass1例如更改Name属性,但不是当你覆盖myClass1.

于 2013-06-17T15:15:46.823 回答
1

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

.NET 语言中的对象引用实际上可以做的事情很少。任何涉及引用类型的成员 [eg myCar.Color = Blue;] 的东西都不会作用于引用类型的存储位置,而是作用于 ID 存储在该位置的对象。

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

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

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

这将修改其中的一些数据,myPoint[0]同时保留所有其他副本startPosition不变。这种行为与类对象的行为非常不同,我们肯定需要意识到这一点,但它本身也非常有用。

于 2013-06-17T15:32:39.250 回答
1

是的,只要你以这种方式使用它。如果 MyObject 是class,不是struct

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

    myClass1.myObject.Name = "Joe";
于 2013-06-17T15:24:53.857 回答
1

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

在此处输入图像描述

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

myClass1.myObject.Name = "Example"
myClass2.myObject.Name == "Example" //true
于 2013-06-17T15:16:01.363 回答
-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
于 2013-06-17T15:17:37.290 回答