1.一直以来,都有这么个概念,引用类型,都是按照引用来传递的。2.所以,类是引用类型 ,那么,当类作为参数进行传递时,如果参数修改时,一定会修改类成员的值吗?3.我今天发现,不一定欧!有时,当类作为参数进行传递时, ,如果参数修改时,不一定会修改类成员的值!!   我不知道,我说的对不对!!

解决方案 »

  1.   

    建议看下,,现在正在激烈讨论的帖子C#中的string到底是什么类型?
    http://topic.csdn.net/u/20090722/19/356762ca-d13a-4e69-a2b5-9a19a0182d46.html?86710
      

  2.   

    string不用谈,虽然是引用类型,当值类型使用
      

  3.   

    STRING 类型不加REF是不会变的,
      

  4.   

    大哥们,有空提高下基本功吧。    class Program
        {
            public static void ChangeString(string str)
            {
                str = "This is ChangeString";
            }
            static void Main(string[] args)
            {
                string test;
                test = "This is Main";
                ChangeString(test);
                Console.WriteLine(test);
            }
        }对应的IL代码是:
    .method private hidebysig static void  Main(string[] args) cil managed
    {
      .entrypoint
      // 代码大小       22 (0x16)
      .maxstack  1
      .locals init (string V_0)
      IL_0000:  nop
      IL_0001:  ldstr      "This is Main"
      IL_0006:  stloc.0
      IL_0007:  ldloc.0
      IL_0008:  call       void cs35.Program::ChangeString(string)
      IL_000d:  nop
      IL_000e:  ldloc.0
      IL_000f:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_0014:  nop
      IL_0015:  ret
    } // end of method Program::Main红色部分表示获取本地局部变量。.method public hidebysig static void  ChangeString(string str) cil managed
    {
      // 代码大小       9 (0x9)
      .maxstack  8
      IL_0000:  nop
      IL_0001:  ldstr      "This is ChangeString"
      IL_0006:  starg.s    str
      IL_0008:  ret
    } // end of method Program::ChangeString红色标记的地方表示存储到调用堆栈上,方法退出以后自然不可能影响到外面的代码了。再来看看ref版的代码    class Program
        {
            public static void ChangeString(ref string str)
            {
                str = "This is ChangeString";
            }
            static void Main(string[] args)
            {
                string test;
                test = "This is Main";
                ChangeString(ref test);
                Console.WriteLine(test);
            }
        }.method private hidebysig static void  Main(string[] args) cil managed
    {
      .entrypoint
      // 代码大小       23 (0x17)
      .maxstack  1
      .locals init ([0] string test)
      IL_0000:  nop
      IL_0001:  ldstr      "This is Main"
      IL_0006:  stloc.0
      IL_0007:  ldloca.s   test
      IL_0009:  call       void cs35.Program::ChangeString(string&)
      IL_000e:  nop
      IL_000f:  ldloc.0
      IL_0010:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_0015:  nop
      IL_0016:  ret
    } // end of method Program::Main
    红色部分表示获取变量的引用!.method public hidebysig static void  ChangeString(string& str) cil managed
    {
      // 代码大小       9 (0x9)
      .maxstack  8
      IL_0000:  nop
      IL_0001:  ldarg.0
      IL_0002:  ldstr      "This is ChangeString"
      IL_0007:  stind.ref
      IL_0008:  ret
    } // end of method Program::ChangeString红色部分表示存储一个引用。
      

  5.   

    不是不一定会,而是一定会~
    除非你在方法里面New了个新的实例,做了且做了深拷贝~