繁体   English   中英

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

[英]What is the difference Between Assignment and Creating Instance of String in C#?

我有示例代码。

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#编译器优化它,因此相同的文字指向相同的字符串实例

MSDN

实习池保存字符串存储。 如果为多个变量分配文字字符串常量,则每个变量都设置为在实习池中引用相同的常量 ,而不是引用具有相同值的几个不同的String实例。

我在这里回答你的问题:

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

简短的回答是:实习文字字符串便宜且容易 ,因此默认情况下完成。 实际动态分配的字符串通常以大量时间为代价节省少量字节,因此不值得打扰 如果你想强制实习,你可以自己动手。

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

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

公共语言运行库通过维护一个名为intern pool的表来保存字符串存储,该表包含对在程序中以编程方式声明或创建的每个唯一文字字符串的单个引用。 因此,具有特定值的文字字符串实例仅在系统中存在一次。

例如,如果将相同的文字字符串分配给多个变量,则运行时将从实习池中检索对文字字符串的相同引用,并将其分配给每个变量。

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

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

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

我看到的方式是,对于myString和myString2,您使用char []创建了那些,并且在创建字符串时,Intern池中没有默认查找。

在myString3和myString4的情况下,myString3为InternPool和myString4增加了值,你只需要一个引用,因为它是样本块。

我之前的印象是在早期版本的框架中IsIntern是可选的,并且让开发人员。 看起来不一定是这种情况

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM