温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ref 与 out

发布时间:2020-07-13 14:28:51 来源:网络 阅读:417 作者:海灬未眠 栏目:开发技术

一.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的区别在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功效,


其作用也很像C中的指针变量。它们的区别是:


1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。


2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。


3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。


out方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。


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


若要使用out参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。

不必初始化作为out参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。


属性不是变量,不能作为out参数传递。 


ref是有进有出,而out是只出不进。


=======================================================================================


函数参数默认是值传递的,也就是“复制一份”。

 

out和ref传递的都是引用而不是值,out侧重于输出使用之前不需赋值而ref在使用之前需要赋值,另外这两个关键字可以变相实现使一个方法输出多个值。

 

1.写一个方法,实现MyTryParse的功能

   bool MyTryParse(string s,out intresult)

   用户只能输入0到100之间的数写一个方法,否则提示超出范围

   返回值表示解析是否成功,result代表解析后的整型值

 

1.形参和实参指向同一地址

2.始终保证形参和实参指向同一地址

 

ref和out不一样:

ref在实参传入时保留其值 而out消除其值

 

 

方法编写的时候的选择:

若方法只有一个返回值 选择使用返回值类型

例:

public static int ReturnInt()
{
         return 1;
}


如果返回值多于1个 选择使用out

public static void ReturnInt(out int a,out int b)
{
           //a、b赋初值
           // a、b参与运算
}

调用时: int c;int d;  ReturnInt(out c,out d);

 

如果需要直接将结果返回到某一个变量上 使用ref

public static void ChangeString(ref String s)
{
                 s= "000"+s;
}

调用时: String ss = "1";  ChangeString(ref ss);

 

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI