C#:参数关键字与列表
使用params关键字与使用列表作为某些c#函数的输入相比,有哪些优点/缺点C#:参数关键字与列表,c#,optimization,list,params,C#,Optimization,List,Params,使用params关键字与使用列表作为某些c#函数的输入相比,有哪些优点/缺点 主要是性能方面的考虑因素和其他权衡。params关键字允许您动态地向函数传递可变数量的参数,而无需担心编译器错误,例如: public string PrefixFormatString(string p, string s, params object[] par) { return p + string.Format(s, par); } ... PrefixFormatString("COM", "Ou
主要是性能方面的考虑因素和其他权衡。params关键字允许您动态地向函数传递可变数量的参数,而无需担心编译器错误,例如:
public string PrefixFormatString(string p, string s, params object[] par)
{
return p + string.Format(s, par);
}
...
PrefixFormatString("COM", "Output Error #{0} - Error = {1}", errNum, errStr);
MethodName(1, 2, 3, 4);
MethodName(new List<int> {1, 2, 3, 4});
如果传递列表,则必须先构造列表,然后才能传递:
public string PrefixFormatString(string p, string s, List<object> par)
{
return p + string.Format(s, par.ToArray());
}
...
List<object> l = new List<object>(new object[] { errNum, errStr });
PrefixFormatString("COM", "Output Error #{0} - Error = {1}", l);
公共字符串前缀formatString(字符串p、字符串s、列表par)
{
返回p+string。格式化(S,PAR toRayay.());
}
...
列表l=新列表(新对象[]{errNum,errStr});
前缀格式字符串(“COM”,“输出错误{0}-Error={1}”,l);
它往往隐藏函数所期望的数据类型的含义
注意,这与传递一个简单的数组变量非常相似。唯一的区别是编译器将为您将参数设置为数组。。。我不是100%确定,但我认为技术上的区别只是语法上的差异——在这两种情况下,您实际上是在传递一个数组,该数组的参数是什么类型的。好吧,使用params关键字,您可以在如下方法中输入参数:
public string PrefixFormatString(string p, string s, params object[] par)
{
return p + string.Format(s, par);
}
...
PrefixFormatString("COM", "Output Error #{0} - Error = {1}", errNum, errStr);
MethodName(1, 2, 3, 4);
MethodName(new List<int> {1, 2, 3, 4});
但如果有一个列表,您可以这样做:
public string PrefixFormatString(string p, string s, params object[] par)
{
return p + string.Format(s, par);
}
...
PrefixFormatString("COM", "Output Error #{0} - Error = {1}", errNum, errStr);
MethodName(1, 2, 3, 4);
MethodName(new List<int> {1, 2, 3, 4});
MethodName(新列表{1,2,3,4});
前者的语法可能比后者更清晰。当您只有一个参数要传入时,这非常有用:
// params
MethodName(1);
// List
MethodName(new List<int> {1});
//参数
方法名称(1);
//名单
方法名称(新列表{1});
嗯,参数
允许在调用它时使用更好的语法,但是列表(假设您的意思是IList
)更灵活,因为不同的类可以实现接口。只有当您需要在列表上执行接口不支持的特定操作(如ToArray()
)时,传递列表才有意义。params
是一种语言构造,用于使用可变参数数的函数。它类似于C省略说明符-即printf(char*fmt,…)
。该语言支持这种操作,也可以使用它,特别是如果它使代码更易于阅读。我个人会跳过参数。我被它咬过一两次。怎么用?让我解释一下
使用此签名编写公共方法:
public static void LogInUser(string username, string password, params string[] options)
你测试它,它工作,它完成了。。。另一个程序集/应用程序正在调用您的函数
现在,一个月后,您希望更改签名以添加用户角色:
public static void LogInUser(string username, string password, string role, params string[] options)
哦,任何调用你的方法的事情都发生了多大的变化
LogInUser("z@z.com", "zz", "Admin", "rememberMe", "800x600");
我可以看到这两种方法之间的主要区别是,传入方法的参数数量是在编译时使用params
设置的,而使用List
则取决于在运行时传入的列表
确定方法在编译时必须使用的参数数量是赞成还是反对,完全取决于您的设计和意图。任何一种都可能是一种好处,这取决于你希望实现的目标
Params
在可读性方面很有帮助,它与您将在C#中获得的可选参数非常接近。如果我需要在任何时候使用未知数量的参数,我只会亲自使用列表
实现
编辑:刚刚发现您关于性能问题的编辑。关于这个话题,我不确定,尽管你是否可能期望使用列表获得大量的“参数”,而参数有一个健全的上限,因为它们必须进行编码。我个人在编写接受其他程序员提供的大量输入的函数时使用参数(例如String.Format
)和IEnumerable
,当编写函数时,这些函数包含计算机提供的数据项列表(例如File.Write
)
性能影响可以忽略不计。担心这样一件小事的性能正是Donald Knuth在著名的“过早优化是万恶之源”一文中所说的
也就是说,询问者似乎对它很感兴趣,所以你来:
1000万次迭代的结果:
params took 308 ms
list took 879 ms
从这些结果中,我们可以看到params数组的速度是它的两倍多。一个简单的事实是,你可以在一秒钟内调用这两个东西中的任何一个1000万次,这意味着你担心它完全是在浪费时间。使用最适合你的代码
测试它的代码(使用VS2008在发布模式下编译和运行)
类程序
{
常数整数计数=10000000;
静态IEnumerable m_值=null;
静态void参数方法(参数字符串[]args)
{m_value=args;}//用它做点什么,停止编译器只是优化这个方法
静态无效列表方法(列表参数)
{m_value=args;}//用它做点什么,停止编译器只是优化这个方法
静态void Main(字符串[]参数)
{
var s=新秒表();
s、 Start();
对于(int i=0;i
params关键字是由C#编译器处理的语法糖。在引擎盖下面,它实际上在转动
void Foo(params object[] a) { ... }
Foo(1,2,"THREE");
进入
从性能的角度来看,就像您所问的那样,params调用的速度更快,因为创建数组比创建列表快一点。上面两个代码片段之间没有性能差异。调用您的方法的程序员的性能有时可以由您的用户改进泰晤士河