在Struct中存储引用类型

max*_*axp 5 c# struct

说我在c#中有一个非常简单的结构

   public struct foo{
   public  int a{get;set;}
   public  int b{get;set;}
   public  int c{get;set;}
   public  int d{get;set;}
   public  string hello {get;set;}
   }
Run Code Online (Sandbox Code Playgroud)

我认为上面比使用它更"有效" class

在什么时候,如果我继续添加字符串属性,是时候将结构转换为类?

编辑:我原计划围绕以GDI为中心的应用程序传递此结构.在处理主要的值类型时,我总是假设结构更高效.

Eri*_*ert 28

我认为上面比使用类更"有效"?

绝对不. 那是一个糟糕的结构.结构应该很小; 不超过,例如,参考尺寸的四倍; 你的struct是32位机器上五个引用的大小.结构应该代表价值 ; 这似乎不代表任何价值.结构应该是不可改变的 ; 这充满了可变性.

在什么时候,如果我继续添加字符串属性,是时候将结构转换为类?

将此结构转换为类的要点是您创建它的那一刻.它本来就不应该是一个结构.你的默认假设应该是类足够好; 只有当你有证据证明这样做可以解决你实际拥有的问题时,才进入结构.

我原计划围绕以GDI为中心的应用程序传递这个结构.在处理主要的值类型时,我总是假设结构更高效.

在极少数情况下,结构比类更有效:当它们很小,不可变,表示,并且由其他值组成,如整数.在其他情况下,它们效率较低:因为结构是按值复制的,所以使用大型结构比引用要慢得多.因为结构是按值复制的,所以可变结构会导致错误,因为当您认为变异变量时,您会复制副本.因为结构是按值复制的,所以它们应该具有值的语义,而不是引用.并且因为垃圾收集器可以完全跳过仅包含其他结构的结构,所以当结构不包含引用时,结构只能更有效地用于清理.

无论如何,你告诉某些事情是否更有效的方式是尝试两种方式,并根据你的绩效目标衡量其绩效.用科学.设定目标并进行衡量.使用结构"因为我认为它们更有效"是根据传闻做出技术决定.衡量,然后你会知道什么是更有效率.

  • @maxp:我不想让结构大得多,而且它是可变的这个事实令人烦恼.但是,可以说它的确表现得像一个价值.此外,可能会创建大量的矩形,例如,在数组中,因此它们不太可能"自己"复制很多.通常通过传递包含矩形的某个引用类型来传递矩形.任何涉及图形的性能要求都很高; 你想避免收集压力.如果通过测量来证明,使其成为结构是合理的选择. (4认同)

3Da*_*ave 5

如果您需要类提供的增强功能(例如继承),请进行切换。如果不是这样,则结构可能会“轻一些”,但是除非您预期到某些性能问题,例如在带有大量迭代的紧密循环内进行垃圾收集,否则ref无论何时您要使用一种方法来进行结构传递,修改等可能会造成不必要的工作。(尽管在该示例中,销毁具有引用类型属性的结构也会导致GC)。

实际的结果是:使用结构还是使用类取决于您的用例,而不是拥有的属性数量。

有关类和结构的优缺点之间的区别的很好的解释,请参见此MSDN文章

有关埃里克·利珀特(Eric Lippert)关于垃圾收集,结构和类的出色笔记,请参见他对这个问题的回答

  • @StriplingWarrior:每个类实例在32位计算机上至少具有12字节的开销,在64位计算机上具有24字节的开销。如果创建一个新类型的实例与传递新实例的数量一样多,则结构的权重通常会比类等效项轻。 (2认同)