4

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

据我了解,实现细节是“由代码产生的行为,可以通过使用代码来依赖,尽管该行为并未由编写代码的规范指定。” . 我知道文档不是规范,但大概如果文档中列出了我们可以依赖的东西并且它不再是实现细节。那么,堆栈是实现细节还是不是?

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

4

2 回答 2

12

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

我似乎记得在某个地方读到 Eric Lippert 说他希望(或者更喜欢,我不记得他提供了何种偏好级别)文档没有提到与structs 相关的堆栈。我看看能不能挖出来

这是您链接到的博客文章中的内容:

我很遗憾文档没有关注最相关的内容;通过关注一个很大程度上不相关的实现细节,我们扩大了该实现细节的重要性,并模糊了使值类型在语义上有用的重要性。我非常希望所有解释“堆栈”是什么的文章都花时间解释“按值复制”的确切含义以及误解或误用“按值复制”如何导致错误。

ECMA 334 C# 规范的相关部分是§11。请注意,本节中从未使用过“堆栈”一词。该部分仅说明语法,即structs 遵循值语义,它们被隐式密封并继承自System.ValueType,对类型变量的赋值struct创建一个副本,将 astruct作为参数按值传递创建一个副本,如何struct设置 s为默认值(所有值类型字段struct都设置为默认值,所有引用类型字段都设置为null),围绕的装箱和拆箱规则, for的struct含义,以及字段初始化、构造函数、析构函数和静态构造函数适用于s。同样,没有提到堆栈。曾经。thisstructstruct

堆栈是一个实现细节,而不是struct.

于 2009-12-29T00:52:55.993 回答
1

对于 C# 值类型,“堆栈”是一个实现细节,因为对值类型执行的每个安全操作的行为方式都相同,与结构是在堆栈上还是在堆上分配无关。

它会产生影响的操作(即最终引用已释放的堆栈帧),例如获取地址并直接使用它(例如,通过遗留 API),是不安全和错误的使用(即不使用编组 API )。

于 2009-12-29T00:52:52.123 回答