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

为什么要用它?如果你编写的函数或方法正在使用它,当你删除它时,代码仍然可以完美地工作,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关键字本身表明,你可以在调用该方法时传递多个参数,而不使用它是不可能的。更具体地说:

static public int addTwoEach(params int[] args)
{
    int sum = 0;

    foreach (var item in args)
    {
        sum += item + 2;
    }

    return sum;
}

当你要调用上述方法时,你可以通过以下任何一种方式调用它:

addTwoEach() 添加两个每个(1) addTwoEach(new int[]{ 1, 2, 3, 4 })

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

其他回答

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});在需要传递单个值而不是整个数组的场景中,可以用于简化。它仍然在方法中以相同的方式处理,但为这种方式调用提供了一些糖果。

不需要创建重载方法,只需使用一个带有参数的方法,如下所示

// 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);

它允许您在调用中添加任意数量的基类型参数。

addTwoEach(10, 2, 4, 6)

而对于第二种形式,你必须使用数组作为参数

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

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

static public int addTwoEach(params int[] args)
{
    int sum = 0;

    foreach (var item in args)
    {
        sum += item + 2;
    }

    return sum;
}

当你要调用上述方法时,你可以通过以下任何一种方式调用它:

addTwoEach() 添加两个每个(1) addTwoEach(new int[]{ 1, 2, 3, 4 })

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

它增强了代码的简洁性。既然可以简洁明了,为什么还要冗长呢?

using System;

namespace testingParams
{
    class Program
    {
        private void lengthy(int[] myArr)
        {
           foreach (var item in myArr)
           {
              //...
           }
        }
        private void concise(params int[] myArr) {
           foreach (var item in myArr)
           {
              //...
           }
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            //Why be lengthy...:
            int[] myArr = new int[] { 1, 2, 3, 4, 5 };
            p.lengthy(myArr);
            //When you can be concise...:
            p.concise(1, 2, 3, 4, 5);
        }
    }
}

如果删除关键字params,调用者代码将不能正常工作。