根据http://msdn.microsoft.com/en-us/library/ms229017.aspx,值类型“在堆栈上分配或与其他结构*内联”。然而在the stack is an implementation detail中,Eric Lippert表示这是一个实现细节。
据我了解,实施细节是"a behavior produced by code which may be relied on by consuming code, though that behavior is not specified by the spec the code is written to."。我理解文档不是一个规范,但是如果文档中列出了我们可以依赖它的东西,它不再是一个细节。那么,堆栈是一个实现细节还是不是吗?
*:我理解这意味着结构也可以在其他结构中分配,而不是直接在堆上分配,尽管我可能是错的。
答案 0 :(得分:11)
MSDN文档告诉您Microsoft C#编译器用于struct
的特定实现。这些特定细节不在ECMA 334 C#规范中;它们不是struct
s语义的一部分。因此,文档中的这些细节是实现细节。
我似乎记得在某处阅读Eric Lippert说他希望(或者更喜欢,我不记得他提供了什么级别的偏好)文档没有提到与struct
相关的堆栈。我会看看我是否可以把它挖出来。
在这里,您链接到的博客文章:
我很遗憾文件没有关注最相关的内容;通过关注一个很大程度上不相关的实现细节,我们扩大了实现细节的重要性,并模糊了使值类型在语义上有用的重要性。我非常希望所有那些解释“堆栈”的文章都会花时间解释究竟“按价值复制”的含义,以及误解或误用“按值复制”会导致错误。
ECMA 334 C#规范的相关部分是§11。请注意,本节中从不使用“堆栈”一词。该部分仅阐明了struct
遵循价值语义的语法,它们被隐式密封并从System.ValueType
继承,对struct
类型变量的赋值创建了一个副本,通过值struct
作为参数传递会创建副本,struct
如何设置为默认值(struct
中的所有值类型字段都设置为其默认值,以及所有引用类型字段设置为null
),围绕struct
的装箱和拆箱的规则,this
的{{1}}的含义,以及字段初始化,构造函数,析构函数和静态构造函数适用于struct
。再一次,没有提到堆栈。如初。
堆栈是一个实现细节,不是struct
的语义的一部分。
答案 1 :(得分:1)
对于C#值类型,'stack'是一个实现细节,因为对值类型执行的每个安全操作都将以相同的方式运行,与结构是在堆栈上还是在堆上分配正交。
它会产生影响的操作(即最终引用解除分配的堆栈帧),比如获取地址并直接使用它(例如通过传统API),是不安全和错误的使用(即不使用编组API)。