堆栈是一个实现细节,或不?

RCI*_*CIX 5 .net stack value-type

根据http://msdn.microsoft.com/en-us/library/ms229017.aspx,值类型"在堆栈上分配或与其他结构*内联".然而在堆栈中是一个实现细节,Eric Lippert表示这是一个实现细节.

根据我的理解,实现细节是"代码产生的行为,可能通过使用代码来依赖,但代码写入的规范并未指定该行为." .我理解文档不是一个规范,但是如果文档中列出了我们可以依赖它的东西,它不再是一个细节.那么,堆栈是一个实现细节还是不是?

*:我理解这意味着结构也可以在其他结构内部而不是直接在堆上分配,尽管我可能是错的.

jas*_*son 11

MSDN文档告诉您Microsoft C#编译器使用的特定实现struct.这些特定细节不在ECMA 334 C#规范中; 它们不是structs 的语义的一部分.因此,文档中的这些细节是实现细节.

我似乎记得在某处阅读Eric Lippert说他希望(或者更喜欢,我不记得他提供了什么级别的偏好)文档没有提到与structs 有关的堆栈.我会看看我是否可以把它挖出来.

在这里,您链接到的博客文章:

我很遗憾文件没有关注最相关的内容; 通过关注一个很大程度上不相关的实现细节,我们扩大了实现细节的重要性,并模糊了使值类型在语义上有用的重要性.我非常希望所有那些解释"堆栈"的文章都会花时间解释究竟"按价值复制"的含义,以及误解或误用"按值复制"会导致错误.

ECMA 334 C#规范的相关部分是§11.请注意,本节中从不使用"堆栈"一词.该部分仅阐明语法,它struct遵循值语义,它们是隐式密封和继承的System.ValueType,对struct类型变量的赋值创建副本,struct通过值传递a 作为参数创建副本,如何struct设置s默认值(所有值类型字段struct都设置为默认值,所有引用类型字段设置为null),围绕装箱和拆箱的规则,s struct的含义,以及字段初始化,构造函数,析构函数和静态构造函数适用于s.再一次,没有提到堆栈.永远.thisstructstruct

堆栈是一个实现细节,而不是语义的一部分struct.