如果在为方法声明参数时未使用 ref 或 out,则该参数可以具有关联的值。可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值。通过使用方法参数关键字,可以更改这种行为。

params

params 关键字可以指定在参数数目可变处采用参数的方法参数。
在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。

示例:

字面意思比较难懂,所以看示例很有用。

 1 // keywords_params.cs 2  3 using System; 4  5 class App 6 { 7     public static void UseParams(params object[] list) 8     { 9         for (int i = 0; i < list.Length; i++)10         {11             Console.WriteLine(list[i]);12         }13     }14 15     static void Main()16     {17         // 一般做法是先构造一个对象数组,然后将此数组作为方法的参数18         object[] arr = new object[3] { 100, 'a', "keywords" };19         UseParams(arr);20 21         // 而使用了params修饰方法参数后,我们可以直接使用一组对象作为参数22         // 当然这组参数需要符合调用的方法对参数的要求23         UseParams(100, 'a', "keywords");24 25         Console.Read();26     }27 }

ref

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

  1. 若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
  2. 传递到 ref 参数的参数必须最先初始化。这与 out 不同,out 的参数在传递之前不需要显式初始化。
  3. 属性不是变量,因此不能作为 ref 参数传递。
  4. 尽管 ref 和 out 在运行时的处理方式不同,但它们在编译时的处理方式是相同的。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的。如果尝试这么做,将导致不能编译该代码。
  5. 如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载。

示例:

按引用传递值类型是有用的,但是 ref 对于传递引用类型也是很有用的。这允许被调用的方法修改该引用所引用的对象,因为引用本身是按引用来传递的。

 1 // keywords_ref.cs 2  3 using System; 4  5 class App 6 { 7     public static void UseRef(ref int i) 8     { 9         i += 100;10         Console.WriteLine("i = {0}", i);11     }12 13     static void Main()14     {15         int i = 10;16 17         // 查看调用方法之前的值18         Console.WriteLine("Before the method calling: i = {0}", i);19 20         UseRef(ref i);21 22         // 查看调用方法之后的值23         Console.WriteLine("After the method calling: i = {0}", i);24         Console.Read();25     }26 }27 28 /**//*29 控制台输出:30 Before the method calling : i = 1031 i = 11032 After the method calling: i = 11033 */

out

out 关键字会导致参数通过引用来传递。这与 ref 关键字类似。

与 ref 的不同之处:

  1. ref 要求变量必须在传递之前进行初始化。
  2. 尽管作为 out 参数传递的变量不需要在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。

示例:

与 ref 示例不同的地方只要将 ref 改为 out,然后变量 i 仅需要声明即可。

1 static void Main()2 {3     //int i = 10; 改为4     int i;5     //6 }

方法参数关键字:params、ref及out相关推荐

  1. C# 参考之方法参数关键字:params、ref及out

    如果在为方法声明参数时未使用 ref 或 out,则该参数可以具有关联的值.可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值.通过使用方法参数关键字,可以更改这种行为. params ...

  2. C# 参考之方法参数关键字:params、ref及out (收集)

    如果在为方法声明参数时未使用 ref 或 out,则该参数可以具有关联的值.可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值.通过使用方法参数关键字,可以更改这种行为. params ...

  3. C#参考之方法参数关键字:params、ref及out

    params 使用 params 关键字可以指定采用数目可变的参数的方法参数. 可以发送参数声明中所指定类型的逗号分隔的参数列表或指定类型的参数数组. 还可以不发送参数. 如果未发送任何参数,则 pa ...

  4. c#方法参数:params

    使用 params 关键字可以指定采用数目可变的参数的方法参数. 参数类型必须是一维数组. 在方法声明中的 params 关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关 ...

  5. C# 编程入门第七课方法调用参数问题,方法标准,传递数组,返回数组,方法高级参数(out关键字参数,ref参数,params可变参数),方法重载,方法的递归,一些常用方法

    C# 编程入门第七课 文章目录 C# 编程入门第七课 1. 方法调用参数问题 2. 方法标准 3.传递数组,返回数组 4. 方法高级参数 4.1 out 关键字参数 4.2 ref 参数 4.3 pa ...

  6. c# 方法参数 传值or传引用?(ref,out,可变参数params,可选参数,命名参数)

    目录 一.方法参数的类型----值类型和引用类型 二.一些特殊的方法参数 1.引用参数---ref 2.输出参数---out 注意:ref和out的区别 3.可变参数/参数数组-----params ...

  7. c# 方法参数(传值,传引用,ref,out,params,可选参数,命名参数)

    一.方法参数的类型----值类型和引用类型 当方法传递的参数是值类型时,变量的栈数据会完整地复制到目标参数中即实参和形参中的数据相同但存放在内存的不同位置.所以,在目标方法中对形参所做的更改不会对调用 ...

  8. C#学习笔记-方法参数params、ref和in、out

    目录 params 用法 ref 用法 按引用传递参数 引用返回值 引用局部变量 in 用法 特殊注意点 优势 out 用法 版本变迁信息 其他 ref.in和out三者异同 方法重载 C#中ref和 ...

  9. C#基础知识-方法参数Params、In、Ref、Out

    方法参数时可以使用的关键字: params 指定此参数采用可变数量的参数. in 指定此参数由引用传递,但只由调用方法读取. ref 指定此参数由引用传递,可能由调用方法读取或写入. out 指定此参 ...

最新文章

  1. 【MySQL】Got fatal error 1236原因和解决方法
  2. DATE_FORMAT(date,format)
  3. linux通过进程名查找进程,Linux下通过进程名获得进程号
  4. oracle shared_pool_size 0,Oracle shared_pool_reserved_size参数设置说明
  5. 2.安装号mysql后当重启Linux服务器之后发现进入不了的解决方案
  6. 【MATLAB统计分析与应用100例】案例009:创建一个RandStream类对象,调用其randn方法生成标准正态分布随机数
  7. 论文浅尝 - ACL2020 | 用于实体对齐的邻居匹配网络
  8. HTML select控件
  9. 旷视发布3D感知全栈解决方案!现在,AI+3D只差杀手级应用了
  10. Codeforces 1132E (看题解)
  11. LU分解的矩阵逆运算
  12. 职场这样发邮件,你死定了!
  13. linux 共享内存 信号量 同步
  14. Akka 2 Actor 源码
  15. 汪文君PowerMock实战视频
  16. 程序员一般可以从什么平台接私活?
  17. Golang 内存逃逸
  18. oracle重做日志教程,Oracle重做日志管理
  19. iphone麦克风_如何从iPhone或iPad上的蓝牙麦克风录制音频
  20. Java实现生成和解析二维码

热门文章

  1. 微信开发——本地测试环境搭建
  2. Python——7列表生成式
  3. CDH ecosystem components
  4. 浅谈 voip 未來企業通信
  5. EXCHANGE虚拟目录功能介绍
  6. Office 365 On MacOS 系列——配置浏览器账号同时管理多个订阅
  7. ODBC的JAR包和PLSQL
  8. openstack windows下远程debug调试(komodo)
  9. 【《zw版·Halcon与delphi系列原创教程》 zw_halcon人脸识别
  10. 有哪些问题应该得到解决?