A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 胡盼盼 中级黑马   /  2013-8-9 18:49  /  1542 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

ref 和out都有哪些区别?

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

7 个回复

倒序浏览
两者之间的共同点是:两者都是传递参数地址。都能改变参数的值。

如例子中的传递参数num和num2,经过计算两者的值都发生了改变;如果不用ref和out的关键字。num和num2 的值依然为10。

不同点:1。ref 可以传进传出,而out的只出不进。

如例子中的Func() 中使用了out的关键字。如果在函数体中不对参数指定值。程序是会出错的。而该函数会把i=2012的值传到外面。

而 ref可以将参数的值传到FunC中,也可以将Func中定义的参数的值传出。如Sample 2 中的方法。

                                           SAMPLE 2static void FunC(ref int i)
{
    int i=2012;

}

而out的,不能采用Sample 1 中的 FunC() 使用的方法。

                                             SAMPLE 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int num = 10;
            int num2=10;
            num = num * 2;
         
            Func(ref num);

            FunC(out num2);
            num2 = num2 * 2;
            Console.WriteLine("num的值为:{0}",num);
            Console.WriteLine("num2的值为:{0}", num2);
            Console.ReadKey();
        }
        static void Func(ref int i)
        {
           
         
        }
        static void FunC(out int i)
        {

            i = 2012;
        }
    }
}

推荐个博客,讲的很详细:http://www.cnblogs.com/greatverve/archive/2012/02/27/ref-out.html

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

回复 使用道具 举报
1. ref必须先初始化,因为是引用,所以必须先“有”,才能引用,而out则是内部为外部赋值,所以不需要初始化,而且外部初始化也没用;
2. ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值,out一般用在函数有多个返回值的场所。
回复 使用道具 举报
Ref和Out关键字的区别:

使用Ref型参数时,传入的参数必须先被初始化。而Out则不需要,对Out而言,就必须在方法中对其完成初始化。
首先:两者都是按地址传递的,使用后都将改变原来的数值。
其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。简而言之,ref是有进有出,out是只出不进
Out更适合用在需要Return多个返回值的地方,而Ref则用在需要被调用的方法修改调用者的引用的时候。
回复 使用道具 举报
马晓凤 发表于 2013-8-9 19:03
两者之间的共同点是:两者都是传递参数地址。都能改变参数的值。

如例子中的传递参数num和num2,经过计算两 ...

O(∩_∩)O谢谢  总算明白了
回复 使用道具 举报
熊丽 发表于 2013-8-9 19:56
Ref和Out关键字的区别:

使用Ref型参数时,传入的参数必须先被初始化。而Out则不需要,对Out而言,就必须 ...

谢谢 很给力啊:)
回复 使用道具 举报
许庭洲 发表于 2013-8-9 19:07
1. ref必须先初始化,因为是引用,所以必须先“有”,才能引用,而out则是内部为外部赋值,所以不需要初始 ...

谢谢 说的太好了 :)
回复 使用道具 举报
out和ref都是传地址的,但是out只传出地址,传入地址是没有初始化的,而ref则是传入了已经初始化的地址,并且传出也是这个地址,所以ref可以传入也可以传出有意义的数据,但是out只能传出。
out参数的函数调用可以当作被传入变量的初始化,即调用之前,变量可以不必初始化,而如果是ref参数的函数调用的话,在调用之前,变量一定要初始化
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马