说我在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为中心的应用程序传递这个结构.在处理主要的值类型时,我总是假设结构更高效.
在极少数情况下,结构比类更有效:当它们很小,不可变,表示值,并且由其他值组成,如整数.在其他情况下,它们效率较低:因为结构是按值复制的,所以使用大型结构比引用要慢得多.因为结构是按值复制的,所以可变结构会导致错误,因为当您认为变异变量时,您会复制副本.因为结构是按值复制的,所以它们应该具有值的语义,而不是引用.并且因为垃圾收集器可以完全跳过仅包含其他结构的结构,所以当结构不包含引用时,结构只能更有效地用于清理.
无论如何,你告诉某些事情是否更有效的方式是尝试两种方式,并根据你的绩效目标衡量其绩效.用科学.设定目标并进行衡量.使用结构"因为我认为它们更有效"是根据传闻做出技术决定.衡量,然后你会知道什么是更有效率.
如果您需要类提供的增强功能(例如继承),请进行切换。如果不是这样,则结构可能会“轻一些”,但是除非您预期到某些性能问题,例如在带有大量迭代的紧密循环内进行垃圾收集,否则ref无论何时您要使用一种方法来进行结构传递,修改等可能会造成不必要的工作。(尽管在该示例中,销毁具有引用类型属性的结构也会导致GC)。
实际的结果是:使用结构还是使用类取决于您的用例,而不是拥有的属性数量。
有关类和结构的优缺点之间的区别的很好的解释,请参见此MSDN文章。
有关埃里克·利珀特(Eric Lippert)关于垃圾收集,结构和类的出色笔记,请参见他对这个问题的回答。