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

解决方案 »

  1.   

                String s1 = "test";
                String s2 = "test";
                IntPtr strPtr1 = Marshal.StringToHGlobalUni(s1);
                IntPtr strPtr2 = Marshal.StringToHGlobalUni(s2);两个内存地址是不同的。
      

  2.   

    Marshal.StringToHGlobalUni
    代表是把托管的string 封送到非托管内存
    strPtr1 和strPtr2 当然不同
      

  3.   

    CLR执行程序时,所有嵌入在源码中的文本常量字符串会被添加到“驻留池”中(Intern Pool。)。所以s1和s2实际都指向驻留池中的“test”,即它们指向的对象是一样的。肯定是一块内存~但是你查看s1和s2的地址会发现s1不等于s2.这是因为s1和s2是两个引用。虽然它们本身的内容不相同,但是它们同是指向一块内存。
      

  4.   

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

  5.   

    你的代码可以通过编译码?msdn 查string 构造函数其实通过object.ReferenceEquals(str1,str2)
    就可以知道了
      

  6.   

    字符串是 Unicode 字符的有序集合,用于表示文本。String 对象是 System..::.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。String 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。看来似乎修改了 String 对象的方法实际上是返回一个包含修改内容的新 String 对象。如果需要修改字符串对象的实际内容,请使用 System.Text..::.StringBuilder 类。---以上摘自msdn
      

  7.   

    前几天刚问过一个类似问题
    大多数情况下应该是同一块内存,但有例外。但实验中 (object)"1" == "1" 都不一定true
      

  8.   

    string s1 = "123";
                string s2 = s1;
                s1 = "456";
                Console.WriteLine(s2);
                Console.WriteLine(s1);实践是检验真理的唯一标准!~明显不一样了!~
      

  9.   

    用object.ReferenceEquals 就可以知道了
      

  10.   

    string是一个特殊的类型!~
    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");
      

  11.   

    StringBuilder s1 = new StringBuilder("test");
                StringBuilder s2 = s1;
                s1.Append("  demo");
                Console.WriteLine(s2);
    再来一个!~明显看到s2结果已经被改变...症结就是因为string是不可变长度的,所以在任何时候当你修改string对象的值的时候,它就会开辟一块新的内存地址!~而StringBuilder 你不重新new一个对象的时候是不会开辟新的地址的!@~
      

  12.   


    两块内存,string型重新赋值的话,会开辟另一块内存