【问题标题】:The stack is an implementation detail, or not?堆栈是实现细节,还是不是?
【发布时间】:2010-12-30 15:37:19
【问题描述】:

根据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."。我知道文档不是规范,尽管如果文档中列出了我们可以依赖的东西并且它不再是实现细节,那么它大概是。那么,堆栈是实现细节还是不是?

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

【问题讨论】:

标签: .net stack value-type


【解决方案1】:

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

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

这里是,来自您链接到的博客文章:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-20
      • 2019-07-06
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 2010-11-06
      • 1970-01-01
      • 2011-02-15
      相关资源
      最近更新 更多