【问题标题】:What is an "object based on value types"?什么是“基于值类型的对象”?
【发布时间】:2017-02-09 12:57:31
【问题描述】:

我正在 MSDN 上阅读这篇关于 new 运算符的文章:

https://msdn.microsoft.com/en-us/library/fa0ab757(v=vs.120).aspx

这一段我没看懂:

结构体等值类型对象是在栈上创建的,而类等引用类型对象是在堆上创建的。这两种类型的对象都会自动销毁,但基于值类型的对象在超出范围时会被销毁,而基于引用类型的对象会在最后一次对其的引用被删除后的未指定时间销毁 .

粗体字到底是什么意思?什么是“基于值/引用类型的对象”?那是一个包含值成员/仅引用成员的对象吗?

编辑我不认为“堆/堆栈是什么”是适当的重复。虽然在该链接线程中选择的答案信息量很大,但我大致了解两者之间的差异——就像“堆栈存储值类型,堆存储引用类型”一样。但我的印象是,“值类型”应该是 intchar;我没有意识到 struct 包含在其中,或者 struct 可以定义为“基于值类型的对象”。

【问题讨论】:

  • 它们分别表示structclass
  • @Igor 我不同意你的重复投票。这与碰巧存储在不同位置的 .NET 类型有关。该页面上没有任何内容可以回答他的问题。
  • @JonathonReinhart 这似乎比我预期的要简单得多,但现在我意识到我对structs 知之甚少,所以我想我现在要阅读那篇文章。 .. 我认为这足以作为我接受的答案,因为它确实回答了我的问题。
  • @sab669 - 我不会太努力地阅读那篇文章。它专注于错误的事情。 (堆栈/堆/生命周期)。我会推荐 Eric Lippert 的 The Truth about Value Types

标签: .net


【解决方案1】:

你想多了:

  • “基于值类型的对象”一般指struct
  • “基于引用类型的对象”一般指class

老实说,我不知道他们为什么在段落中间更改了术语;我认为这会更清楚也更正确:

结构体等值类型对象是在栈上创建的,而类等引用类型对象是在堆上创建的。两种类型的对象都会自动销毁,但值类型的对象会在超出范围时被销毁,而引用类型的对象会在最后一次对它们的引用被删除后的未指定时间销毁。

也许这个解释没有涵盖一些极端情况,但对于大多数情况来说应该已经足够了。

【讨论】:

  • 他们没有特别说classstruct 的主要原因是两者实际上都有其他“成员” - 值类型还包括例如例如,原始类型和枚举,而引用类型也包括例如接口(是的,甚至是由值类型实现的接口)。棘手的部分是,虽然所有 .NET 类型名义上都是从 System.Object 派生的,但它真的是真的 - 运行时 int 不是 object,尽管它可以是 castobject(并且该装箱值不再是​​值类型)。
  • 对 - 我只是不确定他们为什么将段落中间的术语从“值类型对象”更改为“基于值类型的对象”。我想是典型的微软;更冗长但不太清楚。
  • 嗯,这一切都非常复杂,编写文档的人既不是知识最渊博的人,也不是最擅长解释的人。它甚至不一定是同一个人写的 :) 该段的重点显然是明确指出,虽然所有托管对象最终都将被清理,但某些对象可能需要比其他对象更长的时间——它不是权威文档关于 .NET 的内部工作原理(实际上,所有这些都是特定于实现的,不是 CLR 规范的一部分),只是对一些常见场景的快速而肮脏的解释。
猜你喜欢
  • 2021-12-12
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
相关资源
最近更新 更多