Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:参数关键字与列表_C#_Optimization_List_Params - Fatal编程技术网

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关键字与使用列表作为某些c#函数的输入相比,有哪些优点/缺点


主要是性能方面的考虑因素和其他权衡。

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调用的速度更快,因为创建数组比创建列表快一点。上面两个代码片段之间没有性能差异。

调用您的方法的程序员的性能有时可以由您的用户改进泰晤士河