为什么使用params关键字?

我知道这是一个基本的问题,但我找不到答案。

为什么使用它? 如果你写了一个函数或者一个使用它的方法,当你删除它的时候,代码仍然可以正常工作,100%,因为没有它。 例如:

用参数:

static public int addTwoEach(params int[] args) { int sum = 0; foreach (var item in args) sum += item + 2; return sum; } 

没有参数:

 static public int addTwoEach(int[] args) { int sum = 0; foreach (var item in args) sum += item + 2; return sum; } 

有了params你可以调用你的方法是这样的:

 addTwoEach(1, 2, 3, 4, 5); 

没有params ,你不能。

此外, 在这两种情况下 ,都可以使用数组作为参数调用该方法:

 addTwoEach(new int[] { 1, 2, 3, 4, 5 }); 

也就是说, params允许您在调用方法时使用快捷方式。

不相关的,你可以大大缩短你的方法:

 public static int addTwoEach(params int[] args) { return args.Sum() + 2 * args.Length; } 

使用params允许你调用没有参数的函数。 没有params

 static public int addTwoEach(int[] args) { int sum = 0; foreach (var item in args) { sum += item + 2; } return sum; } addtwoEach(); // throws an error 

params比较:

 static public int addTwoEach(params int[] args) { int sum = 0; foreach (var item in args) { sum += item + 2; } return sum; } addtwoEach(); // returns 0 

通常,当参数个数从0到无穷大变化时,可以使用参数,当参数个数从1到无穷大时,使用一个数组。

它允许您在您的呼叫中添加尽可能多的基本types参​​数。

 addTwoEach(10, 2, 4, 6) 

而第二种forms则必须使用数组作为参数

 addTwoEach(new int[] {10,2,4,6}) 

无需创build重载方法,只需使用一个带有参数的单个方法,如下所示

 // Call params method with one to four integer constant parameters. // int sum0 = addTwoEach(); int sum1 = addTwoEach(1); int sum2 = addTwoEach(1, 2); int sum3 = addTwoEach(3, 3, 3); int sum4 = addTwoEach(2, 2, 2, 2); 

params关键字的一个危险是如果对方法调用进行编码之后,a)某人意外/有意从方法签名中删除了一个/多个必需的参数,以及b)紧接在参数之前的一个/多个必需参数签名之前的参数更改是与参数types兼容的,那些调用将继续编译一个/多个以前用于所需参数的expression式,将其视为可选的params参数。 我碰到了最糟糕的情况: params参数是Type object[] 。 这是值得注意的,因为开发人员习惯于使用更多的常见场景,比如使用所有必需参数(因为参数的数量会改变)从一个Method中删除参数的情况下,编译器将其手腕拍打在手腕上。

对我来说,这不值得的快捷方式。 (Type)[]params将使用0到无穷大#参数,而不需要覆盖。 最坏的情况下,你必须添加一个, new (Type) [] {}呼叫不适用。

顺便说一下,最安全(也是最可读的做法)是:a)通过命名parameter passing(现在我们可以在C#之后的二十年内做到这一点); b)这样做一个参数 – PER – LINE更好的可读性,例如避免必须:a)左右滚动(PER LINE,因为大多数人不能读取多行的左边部分,向右滚动并阅读正确的部分),b)计算逗号和从“呼叫”跳转到“签名”以查看正在传递什么参数的expression式。 注意:传入名称镜像参数的variables不会有帮助:a)当您传入Literal Constants时,b)您将重新sorting/replaceSignature中可能导致之前的调用仍在编译中的参数,因为types碰巧仍然是兼容的)。 VS应该有一个选项来生成具有命名参数的方法调用片段(当然每行一个)。 不必使用命名参数(以及保存“宝贵”的“源代码键击”的其他语法)是打卡时代的遗留物。 用现代的IDE和硬件以及更复杂的软件,可读性是非常重要的,这是没有任何借口的。 “代码读取次数多于写入次数”。 当有人(甚至是你自己)稍后尝试阅读时,每次击键都可能成本更高。

params也允许你用一个参数来调用这个方法。

 private static int Foo(params int[] args) { int retVal = 0; Array.ForEach(args, (i) => retVal += i); return retVal; } 

Foo(1); 而不是Foo(new int[] { 1 }); 。 在可能需要传入单个值而不是整个数组的情况下,可以用于简写。 在方法中它仍然以相同的方式处理,但是给这种方式调用一些糖果。

添加params关键字本身显示,您可以传递多个参数,同时调用该方法,这是不可能的,而不使用它。 更具体地说:

 static public int addTwoEach(params int[] args) { int sum = 0; foreach (var item in args) { sum += item + 2; } return sum; } 

当你打电话给上面的方法时,你可以通过以下任何一种方式打电话给你:

  1. addTwoEach()
  2. addTwoEach(1)
  3. addTwoEach(new int[]{ 1, 2, 3, 4 })

但是,当你将删除params关键字只有第三种方式的以上给出的方式将正常工作。 对于第一和第二种情况,你会得到一个错误。