博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ref 和 out 的用法和区别以及params用法
阅读量:5072 次
发布时间:2019-06-12

本文共 3377 字,大约阅读时间需要 11 分钟。

  方法参数可以划分为一下四种类型

1 值参数:声明时不含任何修饰符
2 引用参数:以ref修饰符声明
3 输出参数:以out修饰符声明
4 参数数组:以params修饰符声明
引用参数和输出参数不创建新的存储位置。简单的说
引用参数既能将值带进方法,也能将值带出方法——有进有出(ref)
输出参数不能将值带进方法,只能将值带出方法——只出不进(out)

 

 可参考:

口诀:ref有进有出,out只出不进!

   在C#中既可以通过值传递也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数,可给相应的参数使用ref或者out关键字。其作用很像C中的指针。

ref的用法:

1 namespace ConsoleApplicationTest20160125 2 { 3     class Program 4     { 5         static void Main(string[] args) 6         { 7             string a="初始化!"; 8             refMethod(ref a); 9             Console.WriteLine("ref关键字的用法测试!\t");10             Console.WriteLine("结果:a="+a);11             Console.ReadKey();12          }13 14         private static void refMethod(ref string a)15         {16             a = "执行了ref!";17         }18       19        20     }
View Code

运行结果:

 ref关键字的用法测试!

结果:a=执行了ref!

out的用法:

1 namespace ConsoleApplicationTest20160125 2 { 3     class Program 4     { 5         static void Main(string[] args) 6         { 7             string b;//无需初始化 8             outMethod(out b); 9             Console.WriteLine("out关键字的用法测试!\t");10             Console.WriteLine("结果:b=" + b);11             Console.ReadKey();12 13         }14 15         private static void outMethod(out string b)16         {17             b = "执行了out!";18         }19     }20 }
View Code

运行结果:

out关键字的用法测试
结果:b=执行了out!

ref和out的区别:

1.ref修饰的参数,传参前必须先初始化,否则会报错。而out,必须在方法中对其完成初始化(赋值)。

2.使用ref和out时,定义方法的参数和执行(调用)方法时,都有在对应参数加ref或out关键字,以满足匹配。

3.out适用于在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

4.ref参数在方法体内外始终操作的是同一个引用,而out参数只将一个对象赋给传入的引用。

5.out类型的参数只用于输出,不能传入参数,ref侧重于修改,out更侧重于输出。

使用out时的注意点:

1.带有out参数的方法仍然可以返回一个值。一个方法可以有一个以上的out参数。

2.若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。

3.out参数传递前不比初始化,但必须在方法返回之前为其赋值。

4.属性不是变量,不能作为out参数传递。

一个另类的比喻:

0.0...

你拿个鸡蛋给别人加工成蛋糕,那这个蛋糕(或这个蛋)是ref的

如果你给别人一个蛋,别人马上给你一个蛋糕,那这个蛋糕是out的

ref、out补充:

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

2.如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。但是,如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两个参数,则可以进行重载。

//一、不可以重载的情况class CS0663_Example {    // Compiler error CS0663: "cannot define overloaded     // methods that differ only on ref and out".    public void SampleMethod(ref int i) { }    public void SampleMethod(out int i) { }}//二、可以重载的情况class RefOutOverloadExample{    public void SampleMethod(int i) { }    public void SampleMethod(ref int i) { }}
View Code

 params用法:

 

using System;public class MyClass{    public static void UseParams(params int[] list)    {        for (int i = 0 ; i < list.Length; i++)        {            Console.WriteLine(list[i]);        }        Console.WriteLine();    }    public static void UseParams2(params object[] list)    {        for (int i = 0 ; i < list.Length; i++)        {            Console.WriteLine(list[i]);        }        Console.WriteLine();    }    static void Main()    {        UseParams(1, 2, 3);        UseParams2(1, 'a', "test");        int[] myarray = new int[3] {10,11,12};        UseParams(myarray);    }}

 

当需要传递多个参数,或参数个数不定的时候,就可以用params类型的参数。

params类型的参数搭配数组使用,实现一个不定长的数组参数  最常用的应该是Console.WriteLine,其中有一个重载如下:  public static void WriteLine(string FormatString, params object[] values); 

常见的调用方式:Console.WriteLine("宽:{0},高:{1}",this.Width,this.Height);  前面的"宽:{0},高:{1}"被装入FormatString  this.Width,this.Height被装入values[0]和values[1]之中,如果我们再加几个参数上去,那将按下标继续存入数组中

 

转载于:https://www.cnblogs.com/sdd53home/p/5158082.html

你可能感兴趣的文章
iframe父子页面通信
查看>>
小写金额转中文大写金额
查看>>
【转】Sqlserver通过链接服务器访问Oracle的那些事儿!
查看>>
Spring使用细节
查看>>
动态添加Fragment
查看>>
BackTrack5 (BT5)无线password破解教程之WPA/WPA2-PSK型无线password破解
查看>>
【安卓】eclipse中不可错过的几个秘密、!
查看>>
Leetcode22. Generate Parentheses
查看>>
随机生成
查看>>
Javascript核心概述 - 深入了解javascript
查看>>
ambari 大数据安装利器
查看>>
java 上传图片压缩图片
查看>>
magento 自定义订单前缀或订单起始编号
查看>>
ACM_拼接数字
查看>>
计算机基础作业1
查看>>
Ubuntu 深度炼丹环境配置
查看>>
C#中集合ArrayList与Hashtable的使用
查看>>
js里=、== 和===有什么区别?
查看>>
如何将word转换成html
查看>>
从一个标准 url 里取出文件的扩展名
查看>>