参数修饰符params
为调用者提供了一个将多个参数传递给方法的快捷语法。有两种方法来调用的方法与params
参数:
1)与参数类型的数组调用,在这种情况下params
关键字没有作用并且阵列被直接传递给该方法:
object[] array = new[] { "1", "2" };
// Foo receives the 'array' argument directly.
Foo(array);
2)或者,用的参数的扩展列表,在这种情况下,编译器将自动换行的参数列表中一个临时数组并传递至该方法调用:
// Foo receives a temporary array containing the list of arguments.
Foo("1", "2");
// This is equivalent to:
object[] temp = new[] { "1", "2");
Foo(temp);
为了对象阵列中传递给方法具有“params object[]
”参数,则可以:
1)手动创建包装阵列,并直接传递到方法,如通过lassevk提到:
Foo(new object[] { array }); // Equivalent to calling convention 1.
2)或者,流延的参数object
,如通过Adam提到的,在这种情况下,编译器将创建为您包装阵列:
Foo((object)array); // Equivalent to calling convention 2.
然而,如果该方法的目标是处理多个对象阵列,它可以更容易地声明它带有明确的“params object[][]
”参数。这将允许您通过多个阵列作为参数:
void Foo(params object[][] arrays) {
foreach(object[] array in arrays) {
// process array
}
}
...
Foo(new[] { "1", "2" }, new[] { "3", "4" });
// Equivalent to:
object[][] arrays = new[] {
new[] { "1", "2" },
new[] { "3", "4" }
};
Foo(arrays);
编辑:雷蒙德陈描述了这种行为,以及它如何涉及a new post的C#规范。
params的工作方式似乎是不必要的,而次优的c#设计,因为我们已经习惯了其他语言。 params本来可以用来接受一种形式,并且可以增加一些可以使整个语言受益的扩展类功能,而不仅仅是这种情况。例如,我们可以强制所有参数调用都是Foo(obj [0],obj [1]),然后有一个允许Foo(... obj)的单独传播运算符。 – Lee 2017-12-15 19:21:39