引用 https://www.cnblogs.com/maowp/p/8134342.html
基础知识
1、概念
params 是C#开发语言中关键字, params主要的用处是在给函数传参数的时候用,就是当函数的参数不固定的时候。 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
2、注意项
1、若形参表中含一个参数数组,则该参数数组必须位于形参列表的最后。
2、不允许将params修饰符与ref和out修饰符组合起来使用。
3、参数数组必须是一维数组。
4、与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量。
5、若实参是数组则按引用传递,若实参是变量或表达式则按值传递。
https://www.cnblogs.com/facingwaller/archive/2010/12/28/advance_in_csharp_about_params.html
简单实例
static Int32 Add(params Int32[] values) { // NOTE: it is possible to pass the 'values' // array to other methods if you want to. Int32 sum = 0; if (values != null) { for (Int32 x = 0; x < values.Length; x++) sum += values[x]; } return sum; } public static void Main() { var result1 = Add(1, 2, 3, 4, 5); var result2 = Add(1); var result3 = Add(1); }
原理和性能
public static void Main() { DisplayTypes(1, 3, 4); DisplayTypes(new Object[] { 1, 3, 4 }); Console.Read(); }
//编译后
DisplayTypes(new object[] { (int) 1, (int) 3, (int) 4 }); DisplayTypes(new object[] { (int) 1, (int) 3, (int) 4 });
总之就是param就是提示编译器实现对参数进行数组封装,将可变数目的控制由编译器来完成。
性能
其实质其实构造一个 array 在编译时确定其长度来 承载可变个数的参数.但性能上并不划算:因为需要额外构造一个array。
1在堆上分配内存
2初始化其元素
3最后还得被回收。
总结
1、 一般情况下不要用这种写法。
2、 除非简易型的需要,参数类型相同,只是个数可能是1个或多个(两三个那种,逐个罗列),可以方便使用。如params guid[] customerIds,
需要给人发消息时,接收人可能是1个或多个。
其实是一种正常传数组的偷懒写法。传数组的写法编译时比较干练,性能稍微好点。适用于1个或很多个人。因为不方便逐个罗列每个元素。
元素个数为三五个那种,用params写起来方便,逐个罗列,如。如ReceiveMessage(“hello”,“张三”,”李四”,”王五”)
拓展学习
1参数和返回值尽量使用接口和基类
显而易见,可以适用被更多种(派生)类型。
2、大牛博主撞破南墙有一系列的c#基础进阶博客,可以拓展学习下。
https://www.cnblogs.com/facingwaller/archive/2010/12/28/advance_in_csharp_about_params.html