黑马程序员技术交流社区

标题: 关于引用类型的问题 [打印本页]

作者: 王友伟    时间: 2012-5-18 13:21
标题: 关于引用类型的问题
    class Program
    {
        static void Main(string[] args)
        {
            int[] b = { 1, 2, 3, 4, 5, 6 };                    //数组b是引用类型变量
            string s = "987654";                               //s也是引用类型变量

            cstr(s, b);
            Console.WriteLine(s);                              //为何b改变了,而s没有改变
            foreach (int b0 in b)
            {
                Console.Write(b0);
            }
            Console.WriteLine();
            cstr(ref s);
            Console.WriteLine(s);                               //s原本就是引用类型变量为什么非要用ref引用后才能改变,而s改变了与string类型变量不变是不是自相矛盾?
            Console.ReadKey();
        }

        static void cstr(string s,params int[] b)               
        {
            s = "123456";
            for(int i=0;i<b.Length;i++)
            {
                b[i] = i ;
            }
        }

        static void cstr(ref string s)
        {
            s = "123456";
        }
    }

s原本就是引用类型变量为什么非要用ref引用后才能改变,而s改变了与string类型变量不变是不是自相矛盾?
作者: 吴淑金    时间: 2012-5-21 18:10
string虽然是引用类型,但他在两种情况下回表现出值类型特征:
1:在函数中传递string(比如函数参数是string型)时,传递的是地址,但却不能修改成员变量,原因是它重新又创建了一个全新的对象,和它想修改的那个成员变量非同一地址,所以看上去像是值类型;
2:比较str1 == str2 ,仅仅是比较了值,而非地址(是MS重写了==运算符所致).
作者: 朱亮辉    时间: 2012-5-21 18:56
方法参数的传递有两种方式,一种是值传递,一种是引用传递,当你将数组当作参数时会以引用的方式传递给方法,所以你在执行方法之后会改变原有的参数,而其他的参数传递只是传递了变量的一个副本,无论你对参数做任何的改变都不会体现在原变量上,ref和out就是将变量以引用的方式传递的,所以当你用ref和out处理参数的时候就改变原有的参数值。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2