【问题标题】:Unity/C#, Creating references to existing class instances (GC)Unity/C#,创建对现有类实例的引用 (GC)
【发布时间】:2019-03-03 20:50:44
【问题描述】:

所以我正在制作一款小型手机游戏,并尽我所能将所有内容构建得最好……但有一些问题。

假设您有一个数组中的武器集合,那么创建一个对集合中武器的引用 (activeWeapon) 并使用它而不是直接在数组中访问该集合会有多糟糕?

例如

public Weapon activeWeapon; // Accessing this, and re-assigning from collection when changing weapon.
public Weapon[] weaponCollection;

我假设“activeWeapon”只是一个地址指针,对吧?所以把它分配给收藏中的另一个武器应该不会给太多垃圾吧?

还是我是个坏人?

【问题讨论】:

  • 这只是一个指向对象的指针
  • 这并没有错,正如你所说,它只是指向游戏对象。使用单个引用和数组中的引用将给出相同的结果,并且引用将在两个变量中更新
  • 引用类型的变量不是“垃圾”,它们只是引用对象的变量。当不再有任何对对象的引用时,对象(类型为 ref 类型)就变成了“垃圾”。在大多数程序中,您通常不需要过多考虑垃圾和 GC 问题。有两个关键时刻需要担心。 1)当你分离出很多很快变成垃圾的对象时(循环中的字符串连接很擅长这个),2)当你无意中持有一个对象的引用比你应该的时间长得多时,防止它变成垃圾.一般来说,事情大多是“正常工作”
  • 我明白了,这清楚了很多。感谢您的快速回复 =)

标签: c# unity3d reference garbage-collection


【解决方案1】:

如果您将 Weapon 定义为 C# 中的类(即不是结构),则完全可以按照您描述的方式进行操作。 activeWeapon 只是一个参考,因此您可以根据需要多次更改它,并且它不会导致任何额外的垃圾,因为即使您从两个不同的地方两次引用它,您仍然会拥有该 Weapon 的单个实例.

您可以在此处阅读有关引用类型的更多信息:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/reference-types

【讨论】:

  • 非常感谢您的回答。我完全忘记了实际的指针驻留在堆栈上,并且只在堆上引用。再次感谢。
猜你喜欢
  • 2022-01-20
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 2019-04-06
  • 1970-01-01
相关资源
最近更新 更多