我可以将params列表转发/委托给另一种方法吗?

时间:2012-07-27 01:42:08

标签: c# parameters params

我可以将params参数转发给其他方法吗?

例如,

void MyStringMethod(string format, params object[] list)
{
  String.Format(format, list);
} 

4 个答案:

答案 0 :(得分:7)

适合我。

void Main()
{
    Method1("{0},{1},{2},{3}","Can","I","do","this").Dump();
}

String Method1(string format, params object[] list)
{
    return String.Format(format,list);
}

返回

Can,I,do,this

答案 1 :(得分:1)

我相信你可以,它只是一个对象数组。如果你然后调用另一个需要参数列表的函数,那么你可以得到意想不到的结果(取决于你当然的期望:-)。请注意,在第三种情况下,您只能获得2个参数。

    void Test()
    {
        DoIt(1, 2, 3, 4);
    }

    private void DoIt(params object[] p)
    {
        Console.WriteLine(p.Length);
        DoIt2(p);
        DoIt2(p, 5);
    }

    private void DoIt2(params object[] p)
    {
        Console.WriteLine(p.Length);
    }

答案 2 :(得分:1)

params关键字只是一种语法糖形式,旨在允许您进行方法调用,就好像它们具有动态参数计数一样。它实际上只是对数组实例化的多个参数的编译器转换。这就是一个数组。

数组只是另一个可以传递给其他方法的对象,所以,你可以转发你想要的数组。

答案 3 :(得分:0)

是......但是!

我知道这在技术上并不是一个不同的答案,但是我已经被烧了这么多次而且很难调试错误(在看起来很简单的场景中使用params引起的)我觉得不得不发表这个评论。

使用params时请务必小心。理想情况下不要使用它们,除非你觉得你必须这样做,然后确保你没有在params前面使用相同的数据类型!这可以快速阅读代码(扫描)并知道它将会做什么非常困难,或者更糟糕的是,给你一个意想不到的,很难找到的bug。

例如,在下面的代码中,要查看将打印到控制台的内容并不容易。 (1,2,3)传递给WhoKnocked的{​​{1}}实际上是int 1,后跟int[] [2,3]还是int[] [1,2,3]

void Main()
{
    Console.WriteLine(WhoKnocked(1,2,3));
}

public string WhoKnocked(int x, params int[] knocks)
{
    return "It's mee!";
}

public string WhoKnocked(params int[] knocks)
{
    return "No, it's not, its you!";
}

最后,这是另一个可能会给你一些惊人结果的例子。

void Main()
{
    Greet(1,"foo", "bar");
    Greet(1, 2, "bar");
    Greet(1,"foo", new object());
    Greet(1,2,3);
    Greet(1,2,3,4);
}



public void Greet(int i, params object[] foo)
{
    Console.WriteLine("Number then param array of objects!");
}

public void Greet(int i, int x, params object[] foo)
{
    Console.WriteLine("Number, ...nuther number, and finally object[]!");
}

public void Greet(int i, string x, params object[] foo)
{
    Console.WriteLine("number, then string, then object[]!");
}

产生以下输出

Number, then String, then Object[]!
Number, ...nuther Number, and finally Object[]!
Number, then String, then Object[]!
Number, ...nuther Number, and finally Object[]!
Number, ...nuther Number, and finally Object[]!