string对象保存在堆上而不是堆栈上,是引用类型的,因而当把一个字符串变量赋给另一个字符串时,会得到对内存中同一个字符串的两个引用.然后,修改其中一个字符串,注意这会创建一个完全新的string对象,而另一个字符串没改变!

解决方案 »

  1.   

    是那么解释的?还是string对 = 操作符没有重载,使用的就是object的操作符 = 。所以默认是传递引用?(我不懂,我猜测。错了别打我)
      

  2.   

    public static int Main()
    {
    string str1,str2;
    str1="abc";
    str2="xyz";//修改的
    Console.WriteLine("First,str1={0}, str2={1}",str1,str2);
    str2="def";
    str1 = str2;//修改的
    Console.WriteLine("Again,str1={0}, str2={1}",str1,str2);
    return(0);
    }
    这样试试?
      

  3.   

    由于 String 的值一旦创建就不能再修改,所以称它是恒定的。看似能修改 String 的方法实际上只是返回一个包含修改内容的新 String。如果需要修改字符串对象的实际内容,
      

  4.   

    我与楼上诸位的看法不一样
    我认为String将"="重载过,这可以解释前一个程序
    面第二个的str1和str2是对class2的引用,class2没有对"="重载,所以只有一个class2的实例,当然也只有一个String,所以会出现这种结果
      

  5.   

    同意楼上的,String对象是不可改变的:一旦创建了一个字符串,则不能再更改它的内容。实际上,所有的方法都不能更改原始字符串,而是返回另一个String对象,可将该对象赋给同一个String对象。如果进行这种赋值,将无法从应用程序对原始的String对象进行访问(除非有其他变量指向它),且最终该对象将变成垃圾而被回收。.NET应用程序通过维护一个关于字符串的“拘留池”来优化字符串的管理。若分配给字符串变量的值与“拘留池”内已经存在的某字符串的值相等,则不在分配额外的内存且该变量将得到池内字符串地址。编译器可以通过“拘留池”优化字符串的初始化,并可以使两个字符串变量指向内存中同一String对象。然而,这种优化操作并不是在运行时执行的。
    举个例子:
    Dim s1 As String = "1234"
    s1 &= "5678"
    Dim s2 As String = "12345678"
    Console.WriteLine( s1 Is s2 ) ' ==> False
      

  6.   

    同样的,可以通过下面的例子证明String是引用类型而不是值类型:Dim s1 As String = "ABCD"
    Dim s2 As String = s1
    Console.WriteLine( s1 Is s2 )  ' ==> TrueDim s1 As String = "ABCD"
    Dim s2 As String = "ABCD"
    Console.WriteLine( s1 Is s2 )  ' ==> True
      

  7.   

    简单一点理解就是:内存地址的问题。
    用string定义变量时,重新申请了内存地址;
    用Class是申请的同一内存地址。
      

  8.   

    哦。我也糊涂了。理论强的来解释一下static void Main(string[] args)
    {
    string str1,str2;
    str2 = "abc";
    str1 = str2;
    str2 = "xyl";
    Console.WriteLine("str1 = {0:s}\r\nstr2 = {1:s}\r\n",str1,str2);
    string strT = (str1 == str2 ? "是指向同一地址":"不是");
    Console.WriteLine(strT);//输出结果:不是
    }
      

  9.   

    string是值类型,没有什么可以怀疑的.
    class2 str1,str2;
    输出:
    First,str1=abc, str2=abc
    Again,str1=def, str2=def本来就是这样才对!关string什么事情
    class 是引用类型,当然修改了str2.s就相是修改了str1.s这也不明白
      

  10.   

    System.String类型是一个引用类型.String对象保留在堆上,而不是堆栈上.因此,当把一个字符串变量赋给另一个字符串时,会得到对内存中同一个字符的两个引用.然后,修改其中一个字符串,这会创建一个全新的string对象,而另一个字符串没有改变.
      

  11.   

    那两个class里的string成员是如何被同时修改的?
      

  12.   

    to : xinminhuibaobao(砖头) 
    String对"=="也重载了
      

  13.   

    对class里的string赋值,也相当于重新建了个string,表示吗?