方法签名中的 params 关键字的真正含义是什么

EoR*_*013 5 c# arrays parameters

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

现在,我完全赞成在有意义的情况下节省击键次数。然而,在这种情况下,我怀疑节省的成本是虚幻的,并且会让那些必须维护代码的人感到困惑。这是虚幻的,因为我永远不会向方法发送硬编码的值列表(不好的形式!)。令人困惑的是,维护者如何使用列出一堆值的方法而不是解释我正在做的事情的对象?

OTOH,由于微软的大多数人和这里的大多数人都比我聪明,我怀疑我错过了一些东西。请大家帮我解答一下!

谢谢。

Mar*_*ers 5

你用过吗Console.WriteLine

Console.WriteLine("{0}: The value of {1} is {2}.", lineNumber, foo, bar);
Run Code Online (Sandbox Code Playgroud)

这种调用很有params用。必须显式构造一个数组来包含参数只是噪音,这使得代码在不添加任何值的情况下更难以阅读。与不使用时的外观进行比较params

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

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

  • @paulsm4:不需要意见;查看生成的 MSIL。等价的是,“params”是语法糖。 (3认同)
  • 方便:可以。更有吸引力/更易读:当然。但从根本上*不同*?我不这么认为。恕我直言... (2认同)
  • 某些东西不需要有本质上的不同就可以发挥作用。参数使用的另一个经典示例是 string.Join(",", param1,param2,param3,etc...)`。在不更改 string.Join 方法的情况下,您也可以执行 `string.Join("&", myStringArray)` (2认同)