我可以将params
参数转发给另一个方法吗?
例如,
void MyStringMethod(string format, params object[] list)
{
String.Format(format, list);
}
我可以将params
参数转发给另一个方法吗?
例如,
void MyStringMethod(string format, params object[] list)
{
String.Format(format, list);
}
为我工作。
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
对,但是!
我知道从技术上讲这不是一个不同的答案,但是我已经被烧毁了很多次,因为很难调试错误(由在看起来非常简单的场景中使用参数引起),我觉得有必要发表这个评论。
使用时请务必小心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[]!
我相信你可以,它只是一个对象数组。如果您随后调用另一个需要参数列表的函数,那么您可能会得到意想不到的结果(当然取决于您的期望:-)。请注意,在第三种情况下,您只会获得 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);
}
关键字只是语法糖的params
一种形式,旨在允许您进行方法调用,就好像它们具有动态参数计数一样。它实际上只是将多个参数转换为数组实例化的编译器。就是这样,一个数组。
数组只是另一个可以传递给其他方法的对象,所以是的,你可以转发你想要的那个数组。