C这个字母,有什么特殊含义吗?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1182个文字,预计阅读时间需要5分钟。
刚开始学习,充满期待!
刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例。如下:
String s1 = "Hello";
String s2 = "Hello"; //s2和s1的实际值都是“Hello”
bool same = (object) s1 == (object) s2; //这里比较s1、s2是否引用了同一个对象实例
//所以不能写作bool same = s1 == s2;
//因为String类重载了==操作符来比较String对象包含的实际值
这里的same会被赋值为true。也就是说s1真的和s2引用了同一个String对象。当然,应该注意到的是s1和s2都被统一赋值为同一个字符串“Hello”,这才是出现上述情况的原因。
现在我们初步得出结论,当有多个字符串变量包含了同样的字符串实际值时,CLR可能不会为它们重复地分配内存,而是让它们统统指向同一个字符串对象实例。(这里我说了“可能”,是因为某些情况下,确实也会发生同一个字符串实际值在内存中有多份副本同时存在。请继续往下看。)
我们知道,String类有很多特别的地方,其中之一就是它是“不会改变的”(immutable)。
本文共计1182个文字,预计阅读时间需要5分钟。
刚开始学习,充满期待!
刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例。如下:
String s1 = "Hello";
String s2 = "Hello"; //s2和s1的实际值都是“Hello”
bool same = (object) s1 == (object) s2; //这里比较s1、s2是否引用了同一个对象实例
//所以不能写作bool same = s1 == s2;
//因为String类重载了==操作符来比较String对象包含的实际值
这里的same会被赋值为true。也就是说s1真的和s2引用了同一个String对象。当然,应该注意到的是s1和s2都被统一赋值为同一个字符串“Hello”,这才是出现上述情况的原因。
现在我们初步得出结论,当有多个字符串变量包含了同样的字符串实际值时,CLR可能不会为它们重复地分配内存,而是让它们统统指向同一个字符串对象实例。(这里我说了“可能”,是因为某些情况下,确实也会发生同一个字符串实际值在内存中有多份副本同时存在。请继续往下看。)
我们知道,String类有很多特别的地方,其中之一就是它是“不会改变的”(immutable)。

