这让我困惑:在.NET中,string
类型是一个类,但它的行为看起来像一个值类型!
那么,string
是一个值类型(栈内存)还是引用类型(堆内存)?
这让我困惑:在.NET中,string
类型是一个类,但它的行为看起来像一个值类型!
那么,string
是一个值类型(栈内存)还是引用类型(堆内存)?
System.String
是一个引用类型。其值类型的行为实际上被称为“不可变性”,这意味着一旦创建对象,则无法更改。你期望突变对象的所有操作 (例如 .ToUpper()
) 会创建一个新实例。
可变性是一个与引用类型或值类型无关的话题。你可以有可变的值类型(虽然它们被认为是糟糕的想法™)。
关于分配问题,简单地说,引用类型通常在堆上分配,值类型通常在栈上分配。
在 The Truth About Value Types中,Eric Lippert 解释了 CLR 如何基于生存时间进行分配决策。通常这些都是你不需要担心的细节,但这是有趣的信息。
int[]
中的整数是否放在堆栈上?class C { int x; }
中的整数是否放在堆栈上?当然不是。只需完全摒弃这个疯狂的想法,因为它根本没有任何意义。生命周期已知短暂的变量会放在堆栈上。 - Eric Lippert