var s1 = string.Format("{0}{1}", "abc", "cba");
var s2 = "abc" + "cba";
Console.WriteLine(s2.GetHashCode());
var s3 = "abccba";
Console.WriteLine(s3.GetHashCode());
Console.WriteLine(s1 == s2);
Console.WriteLine((object)s1 == (object)s2);
Console.WriteLine(s2 == s3);
Console.WriteLine((object)s2 == (object)s3);
- 最后一行最终会输出到控制台的是什么?为什么?到目前为止的答案是:真、假、真和???
真的
规则很简单:
object通过地址进行比较在这种情况下,编译器预先根据表达式“计算”出
"abc" + "cba"文字"abccba",并且为了节省成本,编译器将所有相同的文字字符串赋予一个地址,以免浪费内存。由于字符串是C#不可变的,这只是有益的,不会有任何问题。但字符串
s1在程序执行期间就已被“计算”(插值),因此它的地址是不同的。编译器不会在运行时浪费时间搜索重复的字符串。尽管可以保留行以节省内存(给出内存中现有同一行的链接),但这必须显式完成,因为这会浪费宝贵的程序执行时间,程序.NET会尝试以各种可能的方式进行优化,因此尽量不使在没有特殊需要或没有程序员明确指示的情况下执行程序期间不必要的移动。