A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王友伟 中级黑马   /  2012-5-18 13:21  /  1607 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

    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类型变量不变是不是自相矛盾?

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

2 个回复

倒序浏览
string虽然是引用类型,但他在两种情况下回表现出值类型特征:
1:在函数中传递string(比如函数参数是string型)时,传递的是地址,但却不能修改成员变量,原因是它重新又创建了一个全新的对象,和它想修改的那个成员变量非同一地址,所以看上去像是值类型;
2:比较str1 == str2 ,仅仅是比较了值,而非地址(是MS重写了==运算符所致).
回复 使用道具 举报
方法参数的传递有两种方式,一种是值传递,一种是引用传递,当你将数组当作参数时会以引用的方式传递给方法,所以你在执行方法之后会改变原有的参数,而其他的参数传递只是传递了变量的一个副本,无论你对参数做任何的改变都不会体现在原变量上,ref和out就是将变量以引用的方式传递的,所以当你用ref和out处理参数的时候就改变原有的参数值。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马