【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();

 

该场景有二义性,编译器无法判断无参时该选择哪个函数调用。

 

posted @ 2021-04-12 00:00  粽先生  阅读(2662)  评论(0编辑  收藏  举报