【c#笔记】可变长参数(params)
===============================================
2021/4/12_第1次修改 ccb_warlock
===============================================
最早接触关键字params还是在用string.Format拼接字符串,例如下面的例子:
var param1 = "参数1"; var param2 = "参数2"; var s = string.Format("测试{0}、{1}", param1, param2);
变量s的结果是:
测试参数1、参数2
当然按照上面的例子,从c# 6.0开始有更简洁的写法:
var param1 = "参数1"; var param2 = "参数2"; var s = $"测试{param1}、{param2}";
由于最近在整理java代码时看到了相同的内容,故单独记录方便做对比。
params是什么
params是c#中用来标记可变长参数的关键字。
什么时候用params
用于参数个数不确定、但类型相同的函数形参。
怎么用
比如下面的例子:
首先定义一个Test方法,形参arrs用params关键字来标记这是一个可变长参数。
private void Test(params string[] arrs) { if (null == arrs || 0 == arrs.Length) { Console.WriteLine("arrs is null or empty"); return; } foreach (var arr in arrs) { Console.WriteLine($"arr is {arr}"); } }
多个参数调用如下:
Test(); Test("123"); Test("abc", "def");
控制台输出:
arrs is null or empty arr is 123 arr is abc arr is def
限制条件
1)params只能标记一维数组;
2)在方法声明中,只允许有一个params
关键字;
3)在方法声明中,被params
关键字标记的参数之后不允许有其他参数;
当然在params之前可以定义其他参数,例如
public void Test(int index, params string[] arrs) { // todo }
4)不能与ref、out修饰符一起使用;
FAQ
1.没有二义性的场景。
当类中有下面2个方法的定义。
public void Test(string s1, string s2) { // todo } public void Test(params string[] arrs) { // todo }
此时调用函数Test:
// 调用的是Test(string s1, string s2) Test("123", "abc");
该场景没有二义性,编译器会首先匹配非可变长参数的方法。强烈建议在业务代码中不要这样定义,而是将2个函数合并成1个。
2.有二义性的场景。
当类中有下面2个方法的定义。
public void Test(params string[] arrs) { // todo } public void Test(params int[] arrs) { // todo }
此时调用函数Test:
// 编译器报错 Test();
该场景有二义性,编译器无法判断无参时该选择哪个函数调用。