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

本文关键字:实例 什么 区别 创建 字符串 赋值 | 更新日期: 2023-09-27 18:00:26

我有示例代码。

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指向堆中的同一内存块,而myString和myString2却不指向?

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

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

MSDN:

实习生池保存字符串存储如果指定一个文字字符串常量为多个变量,每个变量设置为在实习生池中引用相同的常量,而不是引用具有相同字符串的几个不同实例价值观

我在这里回答您的问题:

http://blogs.msdn.com/b/ericlippert/archive/2009/09/28/string-interning-and-string-empty.aspx.

简短的答案是:插入文字字符串是便宜而简单的,因此默认情况下是这样做的。动态分配字符串的互联通常会以大量时间为代价节省少量字节,因此不值得担心。如果你想强制实习,你可以自己做。

myStringmyString2永远不能相互引用相等(或引用任何其他字符串),因为您显式调用了字符串构造函数,导致每次都创建一个新对象。显然,这个新对象将不会被引用为等同于任何其他已经存在的对象。

myString3myString4是相等的引用,因为编译器实习生字符串:在编译时用字符串文字初始化的字符串值最终在运行时被引用到同一对象:

公共语言运行库通过维护表,称为实习生池,包含对中以编程方式声明或创建的每个唯一文字字符串您的程序。因此,具有特定值在系统中只存在一次。

例如,如果将相同的文字字符串分配给变量,运行时检索对文本的相同引用字符串,并将其分配给每个变量。

这是基于框架中String的底层实现。

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

我认为,对于myString和myString2,您使用char[]创建了它们,并且在创建字符串时,在Internetpool中没有默认查找。

在myString3和myString4的情况下,myString3为InternetPool添加了值,对于myString4,您只得到了一个引用,因为它是示例块。

我之前的印象是,在早期版本的框架中,IsIntern是可选的,并允许开发人员使用。看起来情况不一定如此

也许编译器以某种方式将"str"优化为一个文本,然后将其分配给每个变量,当然,字符串是指针,这意味着它们都指向同一地址。