ref 和out的区别

在C#语言中,参数的传递有两种,一种是值传递,一种是引用传递。ref与out这两种方式都属于引用传递,只是他们的用法稍有不同。下面看几个例子

使用ref的例子

 class test
    {
        static void gump(int i)
        {

            i=12;    

            i += 1; 
        }
     
        static void Main()
        {
            int i = 10;
            gump(i);
            Console.WriteLine(i);
        }
   }

输出结果为:10

再看

class test
    {
        static void gump(ref int i)
        {

            i=12;                  //这个可以不赋值,也不会报错
            i += 1;
        }
     
        static void Main()
        {
            int i = 10;
            gump(ref i);
            Console.WriteLine(i);
        }
   }

输出结果:11

使用out的例子

class test
    {
        static void gump(out int i)
        {

            i=12;                 //必须对i初始化,否则会报错。  (这块就是ref和out的区别之一)
            i += 1;
        }
     
        static void Main()
        {
            int i = 10;
            gump(out i);
            Console.WriteLine(i);
        }
   }

 


当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。

下面来举例说明一下out 的用法

示例:

 class gump
    {
        public void math_routines(double x, out double half, out double squared, out double cubed)
        {
            half = x / 2;                         //必须初始化,否则会报错
            squared = x * x;                  //必须初始化,否则会报错
            cubed = x * x * x;                //必须初始化,否则会报错

        }
    }
    class TestApp
    {
        public static void Main()
        {
            gump g = new gump();
            double x1 = 60;
            double half1 = 0;
            double squared1 = 0;
            double cubed1 = 0;

            Console.WriteLine("Before method->x1={0},half1={1},squared1={2},cubed1={3}", x1,half1 ,squared1,cubed1);


            g.math_routines(x1, out half1, out squared1, out cubed1);
            Console.WriteLine("After method->x1={0},half1={1},squared1={2},cubed1={3}", x1, half1, squared1, cubed1);

        }

       
    }


ref用法示例:

 class gump
    {
        public double square(ref double x)
        {
            x *= x;                        //可以不初始化,不会报错
            return x;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            gump g = new gump();
            double a = 3;
            double b = 5;
            Console.WriteLine("Before square->a={0},b={1}", a, b);

            a = g.square(ref a);
            Console.WriteLine("After square->a={0},b={1}", a, b);
        }
    }

从上面的例子可以看出:

ref必须先初始化才能完成引用。out是内部为外部赋值,所以不需要初始化。

ref是内部对外部的值进行改变,而out则是内部为外部变量赋值。可以返回多个值。

  

posted @ 2014-04-15 21:01  wushuaizaiza  阅读(209)  评论(0编辑  收藏  举报