字符串类型是存储在堆上还是栈上?

6

这让我困惑:在.NET中,string类型是一个类,但它的行为看起来像一个值类型!

那么,string是一个值类型(栈内存)还是引用类型(堆内存)?


1
堆(Heap)是一种引用类型,可以在栈上使用指针或作为另一个堆项集的一部分。 - Adam Houldsworth
1
除了@AdamHouldsworth所说的之外,还有字符串池。 - Redwan
避免混淆,引用类型存储在堆中,值类型存储在栈中(并非总是如此)。 - Sriram Sakthivel
可能是为什么字符串表现得像值类型的重复问题。 - Hans Passant
你似乎相信值类型会放在堆栈上的神话。这是完全错误的。int[]中的整数是否放在堆栈上?class C { int x; }中的整数是否放在堆栈上?当然不是。只需完全摒弃这个疯狂的想法,因为它根本没有任何意义。生命周期已知短暂的变量会放在堆栈上。 - Eric Lippert
显示剩余4条评论
1个回答

8

System.String是一个引用类型。其值类型的行为实际上被称为“不可变性”,这意味着一旦创建对象,则无法更改。你期望突变对象的所有操作 (例如 .ToUpper()) 会创建一个新实例。

可变性是一个与引用类型或值类型无关的话题。你可以有可变的值类型(虽然它们被认为是糟糕的想法™)。


关于分配问题,简单地说,引用类型通常在堆上分配,值类型通常在栈上分配。

The Truth About Value Types中,Eric Lippert 解释了 CLR 如何基于生存时间进行分配决策。通常这些都是你不需要担心的细节,但这是有趣的信息。


2
@Oyeme 感谢您让我们知道 - 我已找到它的新家并更新了链接。 - Paul Turner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接