C# 方法签名中的params关键字到底意味着什么

C# 方法签名中的params关键字到底意味着什么,c#,arrays,params,C#,Arrays,Params,我浏览了Troelsen的Pro C 2010,偶然发现了关于params关键字方法修饰符的讨论。阅读文本、MSDN和其他tubez源代码,在我看来,从params获得的唯一东西是能够将逗号分隔的值列表传递给该方法。我写了一些代码来向自己证明,我可以将不同长度的数组发送到一个不使用params关键字的方法,而且一切都很好 现在,我完全赞成在有意义的时候保存击键。然而,在这种情况下,我怀疑节省的成本是虚幻的,对于那些必须维护代码的人来说是令人困惑的。虚幻的,因为我永远不会把一个硬编码的值列表发送到

我浏览了Troelsen的Pro C 2010,偶然发现了关于params关键字方法修饰符的讨论。阅读文本、MSDN和其他tubez源代码,在我看来,从params获得的唯一东西是能够将逗号分隔的值列表传递给该方法。我写了一些代码来向自己证明,我可以将不同长度的数组发送到一个不使用params关键字的方法,而且一切都很好

现在,我完全赞成在有意义的时候保存击键。然而,在这种情况下,我怀疑节省的成本是虚幻的,对于那些必须维护代码的人来说是令人困惑的。虚幻的,因为我永远不会把一个硬编码的值列表发送到一个坏形式的方法!。令人困惑的是,一个维护人员应该如何处理一个列出一组值的方法,而不是一个解释我所做工作的对象

奥托,因为微软的大多数人,以及这里的大多数人,都比我聪明,我怀疑我错过了什么。请,任何人,启发我

谢谢。

你用过吗

这种调用是params可能有用的地方。必须显式构造一个数组来包含您的参数只是噪声,这使得代码在不添加任何值的情况下更难读取。与未使用参数时的外观相比:

Console.WriteLine("{0}: The value of {1} is {2}.", new object[] { lineNumber, foo, bar });

第二个版本没有向代码中添加任何有用的信息,并且将值从格式字符串中移得更远,从而更难看到发生了什么。

因为我更容易键入:

SomeFuncWithParams(a, b, c);
而不是键入:

SomeFuncWithParams(new object[] { a, b, c });
如果您认为语法糖不是实现功能的好理由,那么您还需要开始质疑属性、using语句、对象初始值设定项等的有效性

是的,我一直认为.Net params关键字在道德上等同于C/C++可变参数

不,我想不出参数和可变长度数组有什么不同


在一句话中,你会问:在现实世界中,params的实际用途是什么?这就是你想问的,如果你看MSIL,它们实际上是等价的。我经常用IEnumerable等价物复制这样的方法。这允许传递一个T,或任意数量的T,或一个可枚举的T。@SteveB:但这并不完全相同。params用于有限数量的方法/函数参数。IEnumerable用于任意大小的集合。@RobertHarvey:是的,我使用了两个重载。示例:public void fooineumerable值{/*处理所有值*/}和public void Fooparam int[]值{fooineumerablevalues;}。这允许您通过以下两种方式之一:;或foo422000001;,或FoomyDataContext.Customers.Selectc=>c.Id;。我经常在实用程序类中使用这样的签名。不需要调用代码来将值从值数组转换到值数组调用。ToList或构建具有固定值的数组使用IEnumerable重载的唯一原因是,如果您希望在元素出现时(即从数据读取器)对其进行处理,而不是一次接收整个集合。否则,只需执行FoomyEnumerable即可节省一些代码和重载。ToArray大多数时候,您不必担心执行顺序。方便:是的。更具吸引力/可读性:当然。但根本不同?我不这么认为。IMHO…@paulsm4:不需要意见;查看生成的MSIL。它是等价的,params是语法上的糖。不需要有本质上的不同,它才有用。params用法的另一个经典示例是string.Join、、param1、param2、param3等。。。。在不更改string.Join方法的情况下,您还可以执行string.Join&,mystringarray Console.WriteLine示例使我更清楚地了解了这一点。书中以及其他地方的例子都是教学工具,它们做的事情就像是将数字传递给计算器函数。做这样的事情——传递值而不是变量和对象——会让我的最佳实践成为泡影。谢谢大家。
SomeFuncWithParams(new object[] { a, b, c });