将引用类型视为持有“对象 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
不变。这种行为与类对象的行为非常不同,我们肯定需要意识到这一点,但它本身也非常有用。