C#中关键字ref和out的区别

      在C#中,ref与out是很特殊的两个关键字。使用它们,可以使参数按照引用来传递。

       ref和out的msdn定义:

    ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。

    out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。

static void TestRefAndOut()

        {

            string s1 = "Good Luck!";

            TestRef(ref s1);

            Console.WriteLine(s1);//output: Hello World!

        }



        static void TestRef(ref string str)

        {

            str = "Hello World!";

        }

         在TestRefAndOut()中将字符串s1以ref关键字的方式传到方法TestRef(ref string str)中,在这个方法中,我们改变了s1的引用变量str的值,最后,回到TestRefAndOut()方法后输出s1的值,发现其值已被改变。

        将ref换成out,如下:

static void TestRefAndOut()

        {

            string s1 = "Good Luck!";

            //TestRef(ref s1);

            TestOut(out s1);

            Console.WriteLine(s1);//output: Hello World!

        }



        static void TestOut(out string str)

        {

            str = "Hello World!";

        }

       他们两个输出结果一样,以此看来没啥区别,然后再换个例子:

static void TestRefAndOut()

        {

            string s1 = "Good Luck!";

            TestRef(ref s1);

        }



        static void TestRef(ref string str)

        {

            Console.WriteLine(str);//output: Good Lick!            

        }


     换成out:

static void TestRefAndOut()

        {

            string s1 = "Good Luck!";

            TestOut(out s1);

        }



        static void TestOut(out string str)

        {

            Console.WriteLine(str);//compile does not pass

        }


       

ref的那段代码顺利编译,输出"Good Luck!",而out那段代码却无法通过编译,提示“Use of unassigned out parameter 'str' ”,即使用了未分配地址的out参数str。怎么回事呢?

原来out参数在进入方法的时候,C#会自动清空它的一切引用和指向,所以在上面的out例子中,必需先要为str参数赋值。如以下程序。

static void TestRefAndOut()

        {

            string s1 = "Good Luck!";

            TestOut(out s1);

        }



        static void TestOut(out string str)

        {

            str = "Hello World!";

            Console.WriteLine(str);//output: Hello World!

        }

    第一个区别:out 参数在进入方法(函数)时后清空自己,使自己变成一个干净的参数,也因为这个原因必须在方法返回之前或再使用out参数前为 out 参数赋值(只有地址没有值的参数是不能被.net接受的);而ref参数是不需要在被调用方法使用前先赋值的,甚至也可以被调用方法中不改变ref参数的值,这都不会引起编译错误。

   第二个区别:ref参数在使用前必需初始化,而out不需要。
     由上边两个区别可以引申一下,out参数只进不出,ref参数有进有出。在用法上概括一下就是:out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值