在哪里定义具有引用类型属性的结构体?

3

我创建了一个包含静态引用类型数组和属性的结构体,该属性通过在结构体中存储的唯一ID获取来自该数组的对象 - 但我不知道这是否有意义,我希望将结构体存储在堆栈上。

struct TestStruct
{
 static TestClass[] Instances = new TestClass[16]; 
 int uid; //max value = 15
 TestClass Instance
 {
  get { return Instances[uid]; }
 } 
}

这听起来不像是一个好主意... - asawyer
如果您能够展示您的结构体而不是描述它,那将非常有帮助。 - Jon Skeet
你实际上永远不可能“拥有”一个引用类型对象。你所能拥有的只是一个指向堆上某个引用类型对象的引用。你的引用实际上是一个值类型,当你访问它时,它会被隐式地解引用回到堆对象。 - MattDavey
2个回答

5

这个结构体本身将被存储在堆栈上。

TestClass是你的引用类型。无论你做什么,它们都将存储在堆上。在这种情况下,Instances是堆上的静态数组。


所示的结构体不包含任何按值引用的引用。唯一的引用在静态变量中。 - Jon Skeet
@Jon - 当我最初发布我的答案时,这个例子还不存在,这是我回来更新的第一次。 - Justin Niessner
没错,尽管“静态数组”部分是 - 这就是我最初要求更多细节的原因 :) - Jon Skeet
@Jon - 为了辩护一下,现在还很早而且我开始理解原问题也有点困难。 :P - Justin Niessner
完全可以理解 - 当时并不是很清楚,而且在我看来现在也还不是那么清楚... - Jon Skeet

2

好的,所以Instances是一个静态变量-所以它将在堆上。同样,数组本身是引用类型,因此也将在堆上。

只有uid变量实际上是特定TestStruct的值的一部分,它将根据上下文在堆上或堆栈上。

但这都是实现细节...你真正想要实现什么目标?


@nilphilus:鉴于您的结构体只包含一个int,为什么不直接使用int呢?无论静态变量是在结构体还是类中,都没有区别。您是否真的发现这个GC会导致真正的性能问题? - Jon Skeet
整个结构体要大得多,这是“TestStruct”。GC每30秒调用一次 - 有时更少,有时更多。 - nilphilus
@nilphilus:好的,所以你给了我们一些并不代表你想要做什么的东西。这对于帮助你并不是非常有用。 - Jon Skeet
这个WP7游戏项目实际上存在GC问题(在Windows版本上进行了分析),没有人喜欢在游戏过程中出现短暂的冻结。 - nilphilus
@nilphilus:是的,这就是改变设计的代价。性能很难做到 :( - Jon Skeet
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接