ref 与 out
admin
2023-08-03 16:00:08
0次

一.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);

 

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...