ref 与 out

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ref 与 out相关的知识,希望对你有一定的参考价值。

一.ref关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何改变都将反


映在该变量中。若要使用ref参数,则方法定义和调用方法都必须显式使用ref关键字。也即是说,在方法中对参数的


设置和改变将会直接影响函数调用之处。无论函数的定义还是调用时均不可忽略关键字ref。


代码①:  static void Main(string[] args)

        {

            int x = 10;

            int y = 20;

            M(ref x, ref y);

            Console.WriteLine("x = {0} , y = {1}" , x , y);

            Console.ReadLine();

        }


        static void M(ref int a , ref int b)

        {

            a = 521;

            b = 520; 

        }


代码②:  static void Main(string[] args)

        {

            int x = 10;

            int y = 20;

            M(ref x, ref y);

            Console.WriteLine("x = {0} , y = {1}" , x , y);

            Console.ReadLine();

        }


        static void M(ref int a , ref int b)

        {

            a = 1000;

            b = 1; 

        }



在此可以看出,在方法中对参数所做的任何更改都将反映在该变量中,而在main函数中对参数的赋值却没有起到作用


,这是不是说明不需要进行初始化呢?看下面一个例子。


代码③:  static void Main(string[] args)

        {

            int x ;

            int y ;

            M(ref x, ref y); //使用了未赋值的局部变量 x,y 。必须要初始化,否则编译通不过。

            Console.WriteLine("x = {0} , y = {1}" , x , y);

            Console.ReadLine();

        }


        static void M(ref int a , ref int b)

        {

            a = 521;

            b = 520; 

        }


二.这说明,ref定义的参数在使用前必须初始化 , 无论在函数定义的时候参数有没有赋予初始值。这条正好区分


out指定的参数可以不在调用函数的时候进行初始化。


三.对out来说,第一条同样适用。将代码①以及②中的ref全部改成out,则可与使用ref得到同样的结果。


四.out指定的参数必须在函数定义的时候就赋初始值。否则出现错误。对比ref指定的参数则

可以不在函数内部赋初始值,在函数调用的时候在函数调用的时候哦在赋值也可以。


        static void Main(string[] args)

        {

            int x = 10;

            int y  = 11;

            M(ref x, ref y); 

            Console.WriteLine("x = {0} , y = {1}" , x , y);

            Console.ReadLine();

        }


        static void M(ref int a , ref int b)

        {

            int temp;

            temp = a;

            a = b;

            b = temp;

        }


代码④:static void Main(string[] args)

        {

            int x = 10;

            int y  = 11;

            M(out x, out y); 

            Console.WriteLine("x = {0} , y = {1}" , x , y);

            Console.ReadLine();

        }


        static void M(out int a , out int b)

        {

            int temp;

            temp = a;//使用了未赋值的out参数,a在参数内部没有赋值,所以出错。

            a = b;//使用了未赋值的out参数,b在参数内部没有赋值,所以出错。

            b = temp;

        }


总结以上四条得到ref和out使用时的区别是:

①.ref指定的参数(例子中的a,b)在函数调用时必须初始化不能为空的引用(x,y)。而指定的参数在函数调用时可以


不初始化( 

        static void M(ref int a , ref int b)

        {

            int temp;

            temp = a;

            a = b;

            b = temp;

        }

    )。

②.out指定的参数在进入函数时会清空自己,必须在函数内部赋初始值。而ref指定的参数不需要。


        static void Main(string[] args)

        {

            int x ;

            int y ;

            M(out x, out y); 

            Console.WriteLine("x = {0} , y = {1}" , x , y);

            Console.ReadLine();

        }


        static void M(out int a, out int b)

        {

            a = 1111;

            b = 22222;

        }


用ref时,例子中的x,y必须初始化值,a,b随便;用out时,M()方法中的参数a,b必须在M()方法内部初始化值,x,y随


便。



以上是关于ref 与 out的主要内容,如果未能解决你的问题,请参考以下文章

Ref与Out的区别

简述ref与out区别

C#中ref与out使用小结

传递参数ref与输出参数out

Ref 与 Out 的使用方法及区别

C# ref与out关键字区别