params
关键字的一个危险是,如果在对方法的调用编码之后,
- 有人意外/故意从方法签名中删除了一个/多个必需的参数,并且
- 紧接在签名更改之前的参数之前的一个/多个必需
params
参数与参数类型兼容params
,
这些调用将继续使用一个/多个以前用于所需参数的表达式进行编译,这些参数被视为可选params
参数。我刚刚遇到了最坏的情况:params
Parameter 是 Type object[]
。
这是值得注意的,因为开发人员已经习惯了编译器在更常见的情况下用所有必需参数从方法中删除参数(因为预期的参数数量会改变)。
对我来说,不值得走捷径。 (Type)[]
withoutparams
将与 0 到无穷大的参数一起工作,而无需覆盖。最坏的情况是您必须, new (Type) [] {}
在不适用的呼叫中添加一个。
顺便说一句,恕我直言,最安全(也是最易读的做法)是:
通过命名参数传递(我们现在甚至可以在 C# 中做到这一点,比我们在 VB 中可以做到的大约 2年;P),因为:
1.1。这是保证防止在参数顺序、兼容类型和/或调用编码后计数更改后传递给参数的意外值的唯一方法,
1.2. 它减少了参数含义更改后的这些机会,因为反映新含义的可能新标识符名称就在传递给它的值旁边,
1.3. 它避免了必须计算逗号并从调用到签名来回跳转以查看正在为什么参数传递什么表达式,以及
1.3.1。顺便说一句,仅此一个原因就足够了(就避免频繁容易出错的 DRY 原则而言,只是阅读代码更不用说修改它了),但是如果有一个/更多被传递的表达式本身包含逗号,即多维数组引用或多参数函数调用。在这种情况下,您甚至不能使用(即使可以,仍然会为每个方法调用的每个参数添加一个额外的步骤)在编辑器的选择中查找所有出现的功能来自动为您计算逗号。
1.4. 如果您必须使用可选参数(params
或不使用),它允许您搜索通过特定可选参数的调用(因此,很可能不是或至少有可能不是默认值),
(注意:原因 1.2. 和 1.3. 可以减轻和减少错误的机会,即使是在对初始调用进行编码时,更不用说何时必须读取和/或更改调用。))
和
这样做 ONE - PARAMETER - PER - LINE 以获得更好的可读性(因为:
2.1。它不那么混乱,并且
2.2. 它避免了必须向右和向左滚动(并且必须每行都这样做,因为大多数凡人无法阅读多行的左侧部分,向右滚动并阅读右侧部分))。
2.3. 它与我们已经演变成的赋值语句的“最佳实践”一致,因为传递的每个参数本质上都是一个赋值语句(将值或引用分配给局部变量)。就像那些遵循编码风格中最新“最佳实践”的人不会梦想每行编写多个作业语句一样,我们可能不应该(一旦“最佳实践”赶上我的“天才”,也不会;P ) 在传递参数时这样做。
注意事项:
在以下情况下,传入名称反映“参数”的变量无济于事:
1.1。您正在传递字面常量(即简单的 0/1、false/true 或 null,即使是“最佳实践”也可能不需要您使用命名常量,并且无法从方法名称中轻松推断出它们的目的),
1.2. 该方法比调用者明显更低级别/更通用,因此您不希望/能够将变量命名为与参数相同/相似(反之亦然),或者
1.3. 您正在重新排序/替换签名中的参数,这可能导致先前的调用仍在编译,因为类型碰巧仍然兼容。
拥有像 VS 这样的自动换行功能只会消除我上面给出的 8 个原因中的一个(#2.2)。在 VS 2015 之前,它没有自动缩进(!?!真的,MS?!?)这增加了原因 #2.2 的严重性。
VS 应该有一个选项可以生成带有命名参数的方法调用片段(当然每行一个;P)和一个需要命名参数的编译器选项(在概念上类似于 VB 中的 Option Explicit,顺便说一句,曾经认为这个要求很简单同样令人发指,但现在是“最佳实践”所要求的)。事实上,“回到我的day" ;),在 1991 年,我的职业生涯刚刚开始几个月,甚至在我使用(或什至见过)带有命名参数的语言之前,我就有了 anti-sheeple /“只是因为你可以,并不意味着你应该” /不要盲目地“切断烤肉”的感觉来模拟它(使用内嵌注释)而没有看到任何人这样做。不必使用命名参数(以及其他节省“珍贵”的语法源代码击键)是大多数这些语法开始时打孔卡时代的遗物。现代硬件和 IDE 以及可读性非常、非常、非常复杂的更复杂的软件没有任何借口更重要。“阅读代码的频率远高于编写代码的频率”。只要您不复制非自动更新的代码,当有人(甚至您自己)稍后尝试阅读它时,保存的每次击键都可能会成倍增加成本。