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

.net 字符串类型存储在堆还是堆栈上?,.net,string,heap-memory,primitive-types,stack-memory,.net,String,Heap Memory,Primitive Types,Stack Memory,让我困惑的是:在.NET中,string类型是一个类,但它的行为看起来像是一个值类型 string是值类型(堆栈内存)还是引用类型(堆内存)?系统。string是引用类型。类似于值的行为实际上是所谓的“不可变性”,这意味着对象一旦创建,就无法更改。所有您希望改变对象的操作(例如.ToUpper())都会创建一个新实例 易变性是一个独立的主题,与引用类型还是值类型无关。您可以有可变的值类型(尽管它们被认为是一个坏主意)™). 对于分配问题,简单的答案是引用类型通常在堆上分配,值类型通常在堆栈上分

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


string
是值类型(堆栈内存)还是引用类型(堆内存)?

系统。string
是引用类型。类似于值的行为实际上是所谓的“不可变性”,这意味着对象一旦创建,就无法更改。所有您希望改变对象的操作(例如
.ToUpper()
)都会创建一个新实例

易变性是一个独立的主题,与引用类型还是值类型无关。您可以有可变的值类型(尽管它们被认为是一个坏主意)™).


对于分配问题,简单的答案是引用类型通常在堆上分配,值类型通常在堆栈上分配


在中,Eric Lippert解释了CLR如何更多地基于生存期而不是其他因素来做出分配决策。通常,这些都是您不必担心的细节,但不管怎样,这都是一个有趣的信息。

Heap在堆栈上有一个指针,或者作为另一个堆项集的一部分,它是一个引用类型。什么@AdamHouldsworth表示加上字符串池。避免混淆引用类型到堆,ValueType到堆栈()。您的意思是什么,但它的行为看起来像值?您能解释其中的一些吗?我的意思是,如果我们有两个字符串变量,它的行为看起来像值?string s1=“koko”,s2;s2=s1;这里s2的值为s1,而不是内存地址链接不起作用anymore@Oyeme谢谢你让我们知道-我已经找到了它的新家并更新了链接。