两个不同的“字符串”是同一个对象实例吗?该代码非常不言自明。我希望在创建a1和b1时创建两个包含相同文本的不同字符串实例。所以我认为a1==b1是真的,但object.ReferenceEquals(a1,b1)是假的,但事实并非如此。为什么?//创建两个看似不同的字符串实例stringa1="test";字符串b1="测试";Console.WriteLine(object.ReferenceEquals(a1,b1));//打印真。为什么?//显式“重新创建”b2stringa2="test";字符串b2="tes";b2+="t";Console.WriteLine(object.ReferenceEquals(a2,b2));//打印False//显式地使用新的字符串构造函数stringa3=newstring("test".ToCharArray());stringb3=newstring("test".ToCharArray());Console.WriteLine(object.ReferenceEquals(a3,b3));//将组合器编译的False文字字符串对象打印到单个实例中。这实际上是规范所要求的:每个字符串文字不一定会产生一个新的字符串实例。当根据字符串相等运算符(第7.9.7节)等效的两个或多个字符串文字出现在同一个程序集中时,这些字符串文字引用同一个字符串实例。编译器针??对字符串文字是否等于“==”运算符进行了优化,而不是创建新实例并且两者都引用同一实例......所以,这就是为什么你的问题的第一部分得到了回答。虽然字符串是引用类型,但相等运算符(==和!=)被定义为按值比较字符串对象,而不是按引用。这使得字符串相等性测试更加直观。例如:stringa="hello";字符串b="h";//附加到'b'的内容b+="ello";Console.WriteLine(a==b);Console.WriteLine((对象)a==(对象)b);这显示“True”然后“False”,因为字符串的内容是等价的,但a和b不引用相同的字符串实例。+运算符连接字符串:stringa="good"+"morning";这将创建一个包含“早上好”的字符串对象。字符串是不可变的——字符串对象的内容在对象创建后不能更改,尽管语法使它看起来好像可以这样做。例如,当您编写这段代码时,编译器实际上创建了一个新的字符串对象来保存新的字符序列,并将该新对象分配给b。然后字符串“h”有资格进行垃圾回收。字符串b="h";b+=“你好”;有关更多参考,请参阅msdn和此。编译器优化了这种情况,并为它们提供了对字符串的相同引用。C#中的字符串是不可变的吗?编译器优化。就这么简单。以上是C#学习教程:两个不同的“字符串”是同一个对象实例吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
