C#中所有的string类型变量都是引用类型的。但我不明白了,如果一个方法接收一个string参数那么,我接收的是这个字符串本身,还是这个string字符串存放的内存地址? 请看下面示例 class Program
    {
        static void Main()
        {
            string x ="abc";
            Test(x);
            Console.WriteLine(x);
        }
        static void Test(string y)
        {
            y = "123";
        }
    }
输出结果是
abc我的问题是,既然string类型是引用类型的,那么输出的结果应该是123,因为传递到Test()的是字符串x的地址。我觉得,这有点和string是引用类型的说法自相矛盾了。
小弟初学,有什么不对的地方请大伙多多指教。

解决方案 »

  1.   

    class A{
          public int Data=10;
    }
      class   Program 
            { 
                    static   void   Main() 
                    { 
                            A   x   =new A();
                            x.Data=20;
                            Test(x); 
                            Console.WriteLine(x.Data); 
                    } 
                    static   void   Test(A y) 
                    { 
                            y   =   new A();
                    } 
            } 
      

  2.   

    哦。谢谢楼上的,我看了你的代码,好像开点窍了。string是引用类型的,但当它被当作参数传递到一个方法中后,当你在方法中给string这个形参赋值的时候,其实是等于实例化了一个这个string的实例。
    不知道,我这么想对不对。大家还有什么看法都踊跃发言阿。
      

  3.   

    所以才会有stringbulid这个东西
      

  4.   


    static   void   Test(out string   y) 
                    { 
                            y   =   "123"; 
                    } 
    这样应该也OK
      

  5.   

    class A{
          public int Data=10;
    }
      class   Program 
            { 
                    static   void   Main() 
                    { 
                            A   x   =new A();
                            x.Data=20;
                            Test(x); 
                            Console.WriteLine(x.Data); 
                    } 
                    static   void   Test(A y) 
                    { 
                         //   y   =   new A(); 我注释掉2楼的这行代码。
                                  y.Data = 100; //我新增的一行代码
                    } 
            } 我把2楼的代码修改一下,运行结果就变成100了。不知我现在理解对不对,string会自动隐含的new出自己的实例。不知道我这么想对不对,还是有什么更官方正正确的说法?谢谢大伙。
      

  6.   

    刚查资料了。string字符串的问题已经基本明白了。说string字符串时引用类型,其实指的是每一个字符串都是引用的计算的字符串池。比如,string x = "abc"; 意思就是 string x 从字符串池里找出"a","b","c"三个字符拼成x的字符串。string x引用的是字符串池"a","b","c"的地址。所以说string是引用类型的。
    其实我们大家使用起来string类型就是按值类型(与值类型使用起来相似)。
      

  7.   

    class Test
    {
     public static void Main()
     {
      string strTest = "123";
      Msg(strTest);
      Console.WriteLine(strTest);  Console.ReadLine();
     } public static void Msg(string str)
     {
      str = "456";
      Console.WriteLine(str);
     }
    } 输出结果是:456
                   123解答如下:string是一个特殊的引用类型,它实际上是一个字符串池,string strTest = "123",其实在堆上strTest中存的是字符串123的引用,当调用Msg方法时,strTest作为参数传递给 str,这个时候只是对strTest做了一个临时的拷贝,使strTest指向字符串456,此时做的修改只是对引用的修改并 没有修改对象本身,所以输出的时候还是原来那个对象的值。
      

  8.   

    这个问题跟string类型是不是引用类型一点关系都没有...如果在为方法声明参数时未使用 ref 或 out,则该参数可以具有关联的值。可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值。通过使用方法参数关键字,可以更改这种行为。
    ------MSDN这是很基础的问题...多看书...多看MSDN...