c# - C# 中字符串的赋值和创建实例有什么区别?

标签 c# string heap-memory

我有示例代码。

var charMass = new char[] { 's', 't', 'r' };
string myString = new string(charMass);
string myString2 = new string(charMass);
string myString3 = "str";
string myString4 = "str";

bool bb1 = Object.ReferenceEquals(myString, myString2);
bool bb2 = Object.ReferenceEquals(myString, myString3);
bool bb3 = Object.ReferenceEquals(myString3, myString4);

为什么 bb1 和 bb2 是假的?我知道 equals 必须显示 true,因为它比较值,但是这些字符串的内存分配呢?为什么 myString3 和 myString4 指向堆中的同一 block 内存,而 myString 和 myString2 不是?

最佳答案

C# 编译器对其进行优化,使相同的文字指向相同的字符串实例

MSDN :

The intern pool conserves string storage. If you assign a literal string constant to several variables, each variable is set to reference the same constant in the intern pool instead of referencing several different instances of String that have identical values.

关于c# - C# 中字符串的赋值和创建实例有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14999429/

相关文章:

c# - 关于 AlphaBeta 算法

c# - 绕过证书验证

c - 如何从调用者分配的内存空间中捕获由被调用者组织的字符串数组?

python - 将 "foo"转换为 "\x66\x6f\x6f"的最佳方法

java - 堆参数对 GC/性能的影响?

c++ - 把它留在堆栈上还是放在堆上?

c# - VB.Net 和 C# "As New WebControl"之间的区别

c# - Dapper、XmlDocument 和西里尔字母符号

c# - 如何使用换行符将值与 asp.net 文本框分开?

android - 更新 VM 选项后无法在 mac 上启动 Android studio