日期:2014-05-17  浏览次数:20771 次

请教一个引用类型的问题
string引用类型,例如:
      ...
     string s1 = "test";
     string s2 = s1;
     ...
托管堆中只有一块内存存储"test",只是s1和s2都引用它。此时改变s1的值不会影响s2的值,因为改变时新创建了个对象,新分配了内存。
但是,如果这样:
      ...
     string s1 = "test";
     string s2 = "test";
     ...
此时在托管堆中,它到底是一块内存,还是两块?
C# 引用类型 托管堆 内存分配 string

------解决方案--------------------
引用:
但是 如果你动态的创建字符串如 string s3=new string("test");则这个创建的会在托管堆上面,和s1,s2指向的不是同一块内存了

你的代码可以通过编译码?msdn 查string 构造函数

其实通过object.ReferenceEquals(str1,str2)
就可以知道了

------解决方案--------------------
前几天刚问过一个类似问题
大多数情况下应该是同一块内存,但有例外。但实验中 (object)"1" == "1" 都不一定true
------解决方案--------------------
StringBuilder s1 = new StringBuilder("test");
            StringBuilder s2 = s1;
            s1.Append("  demo");
            Console.WriteLine(s2);

再来一个!~明显看到s2结果已经被改变...症结就是因为string是不可变长度的,所以在任何时候当你修改string对象的值的时候,它就会开辟一块新的内存地址!~而StringBuilder 你不重新new一个对象的时候是不会开辟新的地址的!@~
------解决方案--------------------
字符串驻留 ,一块内存空间