params
关键字的一种危险是,如果在对方法的调用进行编码之后,
- 有人不小心/有意从方法签名中删除了一个/多个必需的参数,并且
- 在签名更改之前紧接参数之前的一个/多个必需参数
params
与该params
参数类型兼容,
这些调用将继续使用先前用于必需参数的一个/多个表达式进行编译,这些表达式被视为可选params
参数。我只是遇到了最坏的情况:params
参数是Type object[]
。
这是值得注意的,因为开发人员习惯于编译器以更为常见的场景来拍拍手,其中从具有所有必需参数的方法中删除参数(因为预期的参数数量会发生变化)。
对我来说,这不值得捷径。 (Type)[]
无需params
覆盖即可将0设置为无穷大#个参数。最糟糕的情况是,您必须, new (Type) [] {}
在不适用的地方添加“ 通话”。
顺便说一句,恕我直言,最安全(也是最易读的做法)是:
通过命名参数传递(我们现在可以做,甚至在C#〜2个几十年后,我们可以在VB; P)(这是因为:
1.1。这是唯一的方法,可以确保防止在对参数进行顺序编码,对Compatible-Type和/或计数进行编码后更改了传递给Parameters的意外值之后,
1.2。它减少了参数含义更改后的机会,因为反映新含义的可能的新标识符名称就在传递给它的值的旁边,
1.3。它避免了必须计算逗号并从Call to Signature来回跳转,以查看为什么参数传递了什么Expression,以及
1.3.1。顺便说一句,仅仅因为这个原因应该是充足的(以避免频繁出错违反了DRY原则只是为了方面阅读的代码更何况还修改),但这个原因可能是成倍如果有一个更重要的/更多传递的表达式本身包含逗号,即多维数组引用或多参数函数调用。在这种情况下,您甚至无法使用(即使可能,每个方法调用的每个参数仍要添加一个额外的步骤)在编辑器中的“选择”功能中查找所有事件以自动进行逗号计数。
1.4。如果必须使用(params
或不使用)可选参数,则它允许您搜索通过了特定可选参数的呼叫(因此,很可能不是或至少有可能不是默认值),
(注意:原因1.2和1.3可以缓解并减少出错的机会,即使在对初始Call进行编码时,更不用说在必须读取和/或更改Call的情况下了。)
和
这样做一个参数-每行-以获得更好的可读性(因为:
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.1的严重性。
VS应该有一个选项可以生成带有命名参数的方法调用代码段(每行一个; P),以及一个需要命名参数的编译器选项(概念上与VB中的Option Explicit相似,顺便说一句,这个需求曾被认为是正确的)同样令人发指,但现在“最佳做法” 确实要求这样做)。实际上,“回到我的日”;),在我职业生涯的短短1991年,甚至在我使用(或什至没有看到)一种带有“命名参数”的语言之前,我就遇到过反sheeple /“只是可以,但不意味着你应该” /不要盲目地“切开烤肉的末端”感觉来模拟它(使用内嵌注释),而无需任何人这样做。不必使用命名参数(以及其他保存“'precious'”的语法)源代码击键)是当大多数这些语法的开始打卡时代的遗物。有用于与现代的硬件和IDE的和更复杂的软件没有任何借口在那里可读性是很多,很多,MUCH更重要。“代码被读取的次数要多于被写入的次数”。只要您不复制非自动更新的代码,当有人(甚至您自己)以后尝试阅读它时,保存的每个击键都可能成倍增加成本。