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的区别在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);

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享名称:ref与out-创新互联
转载来于:http://ybzwz.com/article/ddgeoc.html