总结ref和out的区别

之前每次遇到ref和out时,老是忘记他们的使用方法和区别。每次都要网上搜一下别人写的博客来回忆。这次干脆自己整合一下别人博客的内容,方便下次忘记时查询。

用途:

 在C#中通过使用方法来获取返回值时,通常只能得到一个返回值。因此,当一个方法需要返回多个值的时候,就需要用到ref和out。

 

概述:

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

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

 

同:

1、都能返回多个返回值。

2、若要使用 ref 和out参数,则方法定义和调用方法都必须显式使用 ref和out 关键字。在方法中对参数的设置和改变将会直接影响函数调用之处(参数的初始值)。

 

异:

1、ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;

2、out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。

 

口诀:

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

 

正确的使用ref:

class Program
    {
        static void Main(string[] args)
        {
            Program pg = new Program();
            int x = 10;
            int y = 20;
            pg.GetValue(ref x, ref  y);
            Console.WriteLine("x={0},y={1}", x, y);

            Console.ReadLine();
        }

        public void GetValue(ref int x, ref int y)
        {
            x = 521;
            y = 520;
        }
    }

运行结果为 

x=521,y=520

 

错误的使用ref:

class Program
    {
        static void Main(string[] args)
        {
            Program pg = new Program();
            int x;
            int y;        //此处x,y没有进行初始化,则编译不通过。
            pg.GetValue(ref x, ref  y);
            Console.WriteLine("x={0},y={1}", x, y);

            Console.ReadLine();
        }

        public void GetValue(ref int x, ref int y)
        {
            x = 1000;
            y = 1;
        }    
    }

 

正确的使用out:

class Program
    {
        static void Main(string[] args)
        {
            Program pg = new Program();
            int x=10;
            int y=233;
            pg.Swap(out x, out y);
            Console.WriteLine("x={0},y={1}", x, y);

            Console.ReadLine();
        }

        public void Swap(out int a,out  int b)
        {
            int temp = a;   //a,b在函数内部没有赋初值,则出现错误。
            a = 521;
            b = 520;
        }     
    }

运行结果为 

x=521,y=520

 

错误的使用out:

class Program
    {
        static void Main(string[] args)
        {
            Program pg = new Program();
            int x=10;
            int y=233;
            pg.Swap(out x, out y);
            Console.WriteLine("x={0},y={1}", x, y);

            Console.ReadLine();
        }

        public void Swap(out int a,out  int b)
        {
            int temp = a;   //a,b在函数内部没有赋初值,则出现错误。
            a = b;
            b = temp;
        }     
    }

原文连接

https://www.cnblogs.com/wolf-sun/p/3371174.html

https://www.cnblogs.com/yanhan/archive/2013/01/26/2877889.html

  • 47
    点赞
  • 204
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#中,ref和out都是用来指定参数按引用传递的关键字。它们的区别在于以下几点: 1. 使用方式:使用ref关键字时,方法的定义和调用方法都必须显式使用ref关键字。而使用out关键字时,只需要在方法的定义中使用out关键字,调用方法时不需要。 2. 初始值:使用ref关键字时,在调用方法之前,传递的参数必须被初始化。而使用out关键字时,可以不对参数进行初始化,因为在方法内部必须将其赋值。 3. 输出参数:使用out关键字时,传递给方法的参数必须在方法内部被重新赋值,即方法必须通过输出参数返回值。而使用ref关键字时,传递给方法的参数可以在方法内部被修改,也可以不被修改。 总结来说,ref关键字用于传递参数,并且方法内部对参数的更改将反映在该变量中,而out关键字一般用于传递输出参数,并且方法必须通过输出参数返回值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C#中out与ref区别实例解析](https://download.csdn.net/download/weixin_38659812/13992002)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C#——ref和out的区别](https://blog.csdn.net/Erenlui/article/details/123886739)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值