8

我可以将params参数转发给另一个方法吗?

例如,

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

4 回答 4

10

为我工作。

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
于 2012-07-27T02:04:39.223 回答
3

对,但是!

我知道从技术上讲这不是一个不同的答案,但是我已经被烧毁了很多次,因为很难调试错误(由在看起来非常简单的场景中使用参数引起),我觉得有必要发表这个评论。

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

例如,在下面的代码中,很难看到将打印到控制台的内容。是(1,2,3)被传递给WhoKnocked实际被识别为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[]!
于 2017-03-05T17:30:23.840 回答
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);
    }
于 2012-07-27T02:05:41.170 回答
1

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

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

于 2012-07-27T02:11:50.247 回答