我可以将params
参数转发给其他方法吗?
例如,
void MyStringMethod(string format, params object[] list)
{
String.Format(format, list);
}
答案 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[]!