params

使用 params 关键字可以指定采用数目可变的参数的方法参数。

可以发送参数声明中所指定类型的逗号分隔的参数列表或指定类型的参数数组。 还可以不发送参数。 如果未发送任何参数,则 params 列表的长度为零。

在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。

 1 public class MyClass2 {3     public static void UseParams(params int[] list)4     {5         for (int i = 0; i < list.Length; i++)6         {7             Console.Write(list[i] + " ");8         }9         Console.WriteLine();
10     }
11
12     public static void UseParams2(params object[] list)
13     {
14         for (int i = 0; i < list.Length; i++)
15         {
16             Console.Write(list[i] + " ");
17         }
18         Console.WriteLine();
19     }
20
21     static void Main()
22     {
23         // You can send a comma-separated list of arguments of the
24         // specified type.
25         UseParams(1, 2, 3, 4);
26         UseParams2(1, 'a', "test");
27
28         // A params parameter accepts zero or more arguments.
29         // The following calling statement displays only a blank line.
30         UseParams2();
31
32         // An array argument can be passed, as long as the array
33         // type matches the parameter type of the method being called.
34         int[] myIntArray = { 5, 6, 7, 8, 9 };
35         UseParams(myIntArray);
36
37         object[] myObjArray = { 2, 'b', "test", "again" };
38         UseParams2(myObjArray);
39
40         // The following call causes a compiler error because the object
41         // array cannot be converted into an integer array.
42         //UseParams(myObjArray);
43
44         // The following call does not cause an error, but the entire
45         // integer array becomes the first element of the params array.
46         UseParams2(myIntArray);
47     }
48 }
49 /*
50 Output:
51     1 2 3 4
52     1 a test
53
54     5 6 7 8 9
55     2 b test again
56     System.Int32[]
57 */


ref

ref 关键字会导致参数通过引用传递,而不是通过值传递。 通过引用传递的效果是,对所调用方法中的参数进行的任何更改都反映在调用方法中。 例如,如果调用方传递本地变量表达式或数组元素访问表达式,所调用方法会将对象替换为 ref 参数引用的对象,然后调用方的本地变量或数组元素将开始引用新对象。

注意:不要混淆通过引用传递的概念与引用类型的概念。 这两种概念是不同的。 无论方法参数是值类型还是引用类型,均可由 ref 修改。 当通过引用传递时,不会对值类型装箱。

若要使用 ref 参数,方法定义和调用方法均必须显式使用 ref 关键字,如下面的示例所示。

 1 class RefExample
 2 {
 3     static void Method(ref int i)
 4     {
 5         // Rest the mouse pointer over i to verify that it is an int.
 6         // The following statement would cause a compiler error if i
 7         // were boxed as an object.
 8         i = i + 44;
 9     }
10
11     static void Main()
12     {
13         int val = 1;
14         Method(ref val);
15         Console.WriteLine(val);
16
17         // Output: 45
18     }
19 }


out

可以在两个上下文(每个都是指向详细信息的链接)中使用 out 上下文关键字作为参数修饰符,或在接口和委托中使用泛型类型参数声明。

如果希望方法返回多个值,可以声明 out 方法。下面的示例使用 out 返回具有单个方法调用的三个变量。注意,第三个参数赋 null 值。这使得方法可以有选择地返回值。

 1 class OutReturnExample2 {3     static void Method(out int i, out string s1, out string s2)4     {5         i = 44;6         s1 = "I've been returned";7         s2 = null;8     }9     static void Main()
10     {
11         int value;
12         string str1, str2;
13         Method(out value, out str1, out str2);
14         // value is now 44
15         // str1 is now "I've been returned"
16         // str2 is (still) null;
17     }
18 }

注意:传递到 ref 形参的实参必须先经过初始化,然后才能传递。 这与 out 形参不同,在传递之前,不需要显式初始化该形参的实参。 尽管作为 out 参数传递的变量无需在传递之前初始化,调用方法仍要求在方法返回之前赋值。

类的成员不能具有仅在 ref 和 out 方面不同的签名。 如果类型的两个成员之间的唯一区别在于其中一个具有 ref 参数,而另一个具有 out 参数,则会发生编译错误。 例如,以下代码将不会编译。

1 class CS0663_Example
2 {
3     // Compiler error CS0663: "Cannot define overloaded
4     // methods that differ only on ref and out".
5     public void SampleMethod(out int i) { }
6     public void SampleMethod(ref int i) { }
7 }

但是,当一个方法具有 ref 或 out 参数,另一个方法具有值参数时,则可以完成重载,如下面的示例所示。

1 class RefOverloadExample
2 {
3     public void SampleMethod(int i) { }
4     public void SampleMethod(ref int i) { }
5 }

在其他要求签名匹配的情况下(如隐藏或重写),ref 和 out 是签名的一部分,相互之间不匹配。

属性不是变量。 它们是方法,不能传递到 ref 参数。

不能将 ref 和 out 关键字用于以下几种方法:

异步方法,通过使用 async 修饰符定义。

迭代器方法,包括 yield return 或 yield break 语句。

转载于:https://www.cnblogs.com/Amedeo/p/5761863.html

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

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

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

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

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

  3. 方法参数关键字:params、ref及out

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

  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. Java 程序员必须了解的 7 个性能指标
  2. java获取文件列表_java获取指定目录中的文件列表
  3. java并发synchronized 锁的膨胀过程(锁的升级过程)深入剖析(1)
  4. Spcok简约图片分享网站Typecho主题
  5. 帝国cms 多语言_多语言组织应在CMS中寻找的8个功能
  6. android 字体切换快捷键,Android stdio 字体设置及快捷键
  7. mysql 解决慢sql_MySQL被慢sql hang住了,用shell脚本快速清除不断增长的慢sql的办法...
  8. “AI+遥感”产品研究现状
  9. 安全辅助 冰刃 IceSword 1.2 中文版 修正号061022
  10. loadrunner 测试 html5,Loadrunner压力测试工具使用教程
  11. coreldraw16开三折页_cdr怎么制作三折页?cdrX6制作三折页模板教程
  12. c语言闰月的计算方法,如何计算闰月如何用计算机编程? 爱问知识人
  13. 下载新浪android SDK
  14. 1月24日源码中国VB源码下载排名
  15. 宝塔面板专业版企业版教程 纯手动 带原版脚本 插件免费用
  16. 小白学习爬虫的第三天之数据解析bs4与pyQuery的使用
  17. LENOVO的Y430P笔记本无线网卡BCM43142在ubuntu 14.04系统WIF上网不稳定
  18. 找出数组中其中最大的数及其下标
  19. TCP/IP 完成端口
  20. 损失函数focal loss深度理解与简单实现

热门文章

  1. Java-并发-LockSynchronized
  2. C#创建、安装一个Windows服务
  3. 集中配置管理工具puppet安装使用
  4. mysql5.6安装及实现双向备份
  5. Hyper-V备份:选择Hypervisor备份还是虚拟机备份
  6. iBATIS.NET DataMapper V1.3 Beta and DataAccess V1.7 Beta发布了
  7. today便利 java_在Today今天便利店吃饭,你的要求可以再高一点
  8. java 注解去掉缓存_java spring 使用注解来实现缓存
  9. comsol线圈不能加电流激励_为什么电压互感器不能短路,电流互感器不得开路?...
  10. matlab plot画图指定线型和颜色