字符串类型是存储在堆上还是栈上?
Posted
技术标签:
【中文标题】字符串类型是存储在堆上还是栈上?【英文标题】:Is the string type stored on the heap or the stack? 【发布时间】:2014-04-01 08:27:25 【问题描述】:让我感到困惑的是:在 .NET 中,string
类型是一个类,但它的行为看起来像是一个值类型!
那么string
是值类型(栈内存)还是引用类型(堆内存)?
【问题讨论】:
在堆栈上有指针的堆或作为另一个堆项集合的一部分,它是一个引用类型。 @AdamHouldsworth 所说的加上字符串池。 避免混淆 引用类型进入堆,值类型进入堆栈(not always)。 你的意思是但它的行为看起来像价值?你能解释一下其中的一些吗? 我的意思是 但如果我们有 2 个字符串变量,它的行为看起来像值 ?字符串 s1="koko",s2; s2=s1;这里 s2 将具有 s1 的值而不是内存地址 【参考方案1】:System.String
是一个引用类型。类值行为实际上就是所谓的“不变性”,即对象一旦创建就无法更改。您希望改变对象的所有操作(例如.ToUpper()
)都会创建一个新实例。
可变性与某事物是引用类型还是值类型是不同的主题。您可以拥有可变值类型(尽管它们被认为是 Bad Idea™)。
对于分配问题,简单的回答是引用类型通常分配在堆上,值类型通常分配在堆栈上。
在The Truth About Value Types 中,Eric Lippert 解释了 CLR 如何更多地基于生命周期做出分配决策。通常这些是您不需要担心的细节,但无论如何,这些都是有趣的信息。
【讨论】:
@Oyeme 感谢您告诉我们 - 我找到了它的新家并更新了链接。以上是关于字符串类型是存储在堆上还是栈上?的主要内容,如果未能解决你的问题,请参考以下文章