C#传入基本类型和引用类型的区别,ref 有事怎样使用的?????

解决方案 »

  1.   

    ref官方解释:ref 关键字使参数按引用传递。 其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。
    你将下面两种测试方法看下运行结果  在看解释 就会理解了  
    //测试一
    static void Method(ref string s)
        {
            s = "changed";
        }
        static void Main()
        {
            string str = "original";
            Method(ref str);
            Console.WriteLine(str);
        }//测试二
    static void Method(ref string s)
        {
            s = "changed";
        }
        static void Main()
        {
            string str = "original";
            Method(str);
            Console.WriteLine(str);
        }
      

  2.   

    void foo1(int i)
    {
        i = 3;
    }
    void foo2(ref int i)
    {
        i = 3;
    }Main()
    {
        int x = 10;
        int y = 10;
        foo1(x);
        foo2(ref y);
        Console.WriteLine("{0}, {1}", x, y);
    }
      

  3.   

    ref参数的好处之一就是实现一个函数有多个返回值
    out参数也是这样,不过ref参数要先初始化才能用。
      

  4.   

    值传递
    引用传递所为值传递就是值在传如果你定义一个int a=5你传来传去,把5折腾来折腾去,最后你打印输出a发现还是5
    这个时候你就用到ref,这样认为是在改变变量本身int a=5
    method(){a=10}
    输出 a 还是5int a=5
    method(ref a){a=10}
    输出a  是10
      

  5.   

    值传递
    引用传递ref  是你带进去的值类型引用完后会变化
      

  6.   

    值类型是传副本,加了ref当引用传递(对对象本身操作) class OX
        {
            public static void HexStringToBytes(ref byte[] buf, ref int len, string hexStr)
            {
                int i;            for (i = 0; i < hexStr.Length / 2; i++)
                {
                    buf[i] = Convert.ToByte(hexStr.Substring(i * 2, 2), 16);
                }            len = i;
            }
        }byte[] bytesa = new byte[1024];
    string str="313203";
                OX.HexStringToBytes(ref bytesa, ref p.len, str);
                foreach (var b in bytesa)
                {
                    Console.Write("[{0}]", b);
                }
    //看到了吧,这里的ref bytesa,直接操作bytesa,里面已经有值了
      

  7.   

    ref请参见
    C# 关键字 | 方法参数
    方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。属性不是变量,不能作为 ref 参数传递。如果两种方法的声明仅在它们对 ref 的使用方面不同,则将出现重载。但是,无法定义仅在 ref 和 out 方面不同的重载。例如,以下重载声明是有效的:class MyClass 
    {
        public void MyMethod(int i) {i = 10;}
        public void MyMethod(ref int i) {i = 10;}
    }
    但以下重载声明是无效的:class MyClass 
    {
        public void MyMethod(out int i) {i = 10;}
        public void MyMethod(ref int i) {i = 10;}
    }
    有关传递数组的信息,请参见使用 ref 和 out 传递数组。http://hi.baidu.com/328313266/blog/item/b8a364ca396b7e19be09e6fa.html
      

  8.   

    C#传入基本类型  实际上在传递的是副本,(因为在传的时候自己生成的,)
    引用类型  传的是真本,他也没有印副本,所以只有一本,相当于指针,指是的一个地址,
    ref 就是让基本类型按照引用类型的方式来传比如你去一公司面试,有的就要求你带毕业证的原本(不是原本还不行,这时候你只能带原本了,就是按引用类型的方式去给公司,它们才相信你是那个大学毕业的(因为是毕业证看完后,他肯定还给你,实际程序里这个毕业证被程序处理后就变成另一种东西了,你愿意吗?))这就是对参数本身操作有的公司就可以不看原本,你只要给个副本它看一下就可以了,这时候你不用搞真本,你到复印店复一份给公司就行了,将来这份不会造成你的原本丢失呀,等等问题,