string引用类型,例如:
...
string s1 = "test";
string s2 = s1;
...
托管堆中只有一块内存存储"test",只是s1和s2都引用它。此时改变s1的值不会影响s2的值,因为改变时新创建了个对象,新分配了内存。
但是,如果这样:
...
string s1 = "test";
string s2 = "test";
...
此时在托管堆中,它到底是一块内存,还是两块?C#引用类型托管堆内存分配string
...
string s1 = "test";
string s2 = s1;
...
托管堆中只有一块内存存储"test",只是s1和s2都引用它。此时改变s1的值不会影响s2的值,因为改变时新创建了个对象,新分配了内存。
但是,如果这样:
...
string s1 = "test";
string s2 = "test";
...
此时在托管堆中,它到底是一块内存,还是两块?C#引用类型托管堆内存分配string
String s2 = "test";
IntPtr strPtr1 = Marshal.StringToHGlobalUni(s1);
IntPtr strPtr2 = Marshal.StringToHGlobalUni(s2);两个内存地址是不同的。
代表是把托管的string 封送到非托管内存
strPtr1 和strPtr2 当然不同
就可以知道了
大多数情况下应该是同一块内存,但有例外。但实验中 (object)"1" == "1" 都不一定true
string s2 = s1;
s1 = "456";
Console.WriteLine(s2);
Console.WriteLine(s1);实践是检验真理的唯一标准!~明显不一样了!~
List<string> listName = new List<string>();
listName.Add("张三");
listName.Add("李四");
List<string> listAddress = listName;
listName[0] = "123";
listName[1] = "456";
Console.WriteLine(listAddress[0]);
Console.WriteLine(listAddress[1]);
很明显的看见了区别所在...所以string s1="123";//结果等价string s1=new string("123");
StringBuilder s2 = s1;
s1.Append(" demo");
Console.WriteLine(s2);
再来一个!~明显看到s2结果已经被改变...症结就是因为string是不可变长度的,所以在任何时候当你修改string对象的值的时候,它就会开辟一块新的内存地址!~而StringBuilder 你不重新new一个对象的时候是不会开辟新的地址的!@~
两块内存,string型重新赋值的话,会开辟另一块内存