C# 结构的内存限制

C# 结构的内存限制,c#,memory,struct,C#,Memory,Struct,我读到: 避免定义结构,除非该类型具有以下所有特征:[……] 它的实例大小小于16字节 基于此,我得出结论,字符串内存使用量至少为20字节 所以我想知道创建一个带有字符串成员的结构是否被认为是一件好事。我知道MSDN上提到的文章中说的是“避免”,而不是“你不能”。话虽如此,我还是不清楚为什么会提出16字节的限制字符串数据不在结构内部。该结构仅存储8字节的对象引用(如果为64位) 这个限制是一个简单的性能启发。大型结构的复制成本很高。如果在你的情况下复制不是一个问题,你可以完全无视这个建议 例如,

我读到:

避免定义结构,除非该类型具有以下所有特征:[……] 它的实例大小小于16字节

基于此,我得出结论,字符串内存使用量至少为20字节


所以我想知道创建一个带有字符串成员的结构是否被认为是一件好事。我知道MSDN上提到的文章中说的是“避免”,而不是“你不能”。话虽如此,我还是不清楚为什么会提出16字节的限制

字符串数据不在结构内部。该结构仅存储8字节的对象引用(如果为64位)

这个限制是一个简单的性能启发。大型结构的复制成本很高。如果在你的情况下复制不是一个问题,你可以完全无视这个建议

例如,如果您主要使用此类结构的大型数组,并通过引用访问数组元素,则不存在复制。当你说
bigArray[i].x++
时,它直接修改
x


主观提示:


我也不喜欢你所引用的那种笼统的概括。我发现,更详细地了解性能特征可以让您完全摆脱这些简单的规则。但这不是问题的重点。

String是一种引用类型。当谈到
struct
实例大小时,不管其大小如何,任何引用都将占用4或8字节,具体取决于体系结构。我想复制不会影响内存。在所有其他情况下,您应该将您的类型定义为类。因此,它是一个应该,因此是一个建议,而不是命令。所以泛化可能是可以的。@xanatos,正如你在我的上一段中所看到的,我也提到了这一点,这就是为什么我甚至想知道他们为什么增加了这个限制。我认为
bigArray[I]。x++
甚至不会为结构编译。@HimBromBeere数组有特殊的处理。。。它可以工作:(对于
x
字段和
x
属性)@HimBromBeere不,数组直接由运行时处理。
[x]
索引器是IL语言的“本机”<代码>列表没有这种奢侈,它的索引器是通过方法(项目索引器方法)在IL级别构建的