【问题标题】:Weird value referencing奇怪的值引用
【发布时间】:2011-11-16 07:59:41
【问题描述】:

我今天遇到了一个问题,我之前已经发生过好几次了。我有我的对象的通用列表:

List<Classes.Object.GameObject> ObjectList = new List<Classes.Object.GameObject>();

我决定通过以下方式从列表中获取Classes.Object.GameObject 的实例:

Classes.Object.GameObject TempObject = new Classes.Object.GameObject;
TempObject = ObjectList[10];

到这里为止它工作得很好,但是当我对 TempObject 进行一些更改时,我提到的列表中的索引对象也发生了变化!我的意思是 ObjectList[10] 会随着 TempObject 的改变而改变。根本没有参考。可能我对 OO 编程不是很了解。

亲爱的版主你在编辑我的语法时犯了一个错误! (您将 until 更改为 until)

【问题讨论】:

标签: c# instantiation


【解决方案1】:

在 C# 中,所有对象都是通过引用处理的。问题出在这里:

// Create a new GameObject and have the TempObject reference point to it.
Classes.Object.GameObject TempObject = new Classes.Object.GameObject;
// Change the TempObject reference to point to the object at ObjectList[10].
TempObject = ObjectList[10];

TempObject 现在引用列表中的对象。如果你改变它,你将改变列表中的对象——因为它们是同一个对象。在 C# 中,如果您想要一个单独的对象,则必须从旧对象显式创建一个新对象。如果浅拷贝就够了,可以使用MemberWiseClone方法新建对象。

如果您来自 C++,这是一个常见的陷阱;在 C++ 中,这会将ObjectList[10] 的对象复制到TempObject

【讨论】:

  • 正是你所说的。谢谢。
【解决方案2】:

如果您想更改TempObject 而不会影响列表中的“原始版本”,请复制一份。描述于Cloning objects in C#

【讨论】:

    【解决方案3】:

    因为您将GameObject 的引用分配给TempObjectObjectList[10]TempObject 引用变量都具有 common 对象的引用。

    【讨论】:

      【解决方案4】:

      如果您不想被引用,请确保在这种情况下创建对象的深层副本。

      使用此链接了解更多信息Deep Copy in C#

      【讨论】:

        【解决方案5】:

        对于每个引用类型(假设是每个“类”),您只需使用“=”设置对变量的引用 将您的列表想象为参考列表。 将 ObjectList[10] 分配给您的 TempObject 时,您将引用与 ObjectList 引用相同的实际对象。

        如果你想复制一个对象,请自己创建一个 Copy() 方法。

        【讨论】:

          【解决方案6】:

          如何将 Classes.Object.GameObject 定义为值类型(结构)而不是引用类型(类)?你能给出GameObject的定义吗?

          【讨论】:

            【解决方案7】:

            TempObjectObjectList[10] 都指向堆中的相同内存位置,因为它们是类的对象,因此是引用类型。因此,如果您更改一个对象变量中的值,它也会由于在一个内存位置所做的更改而反映在其他变量中。

            您可以在下面的文章中很好地掌握值和引用类型的内存分配:

            http://www.albahari.com/valuevsreftypes.aspx

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-09-28
              • 2015-09-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多