我有一个像这样的方法:
新的需求会导致如下更改:
问题在于,尽管我已更改了方法签名,但没有出现编译错误,这当然是正确的,但我希望每次调用未指定参数
现在需要的是这个:
如果不以这种方式更改,
如何改变签名并确保所有调用代码都相应更新是最好的方式?(真实情况是,
编辑:正如丹尼尔·曼和其他人指出的那样,上面的示例表明我根本不应该使用params。因此,我应该解释一下,在我的现实例子中,并非总是需要args有两个元素,就Foo的逻辑而言,args可以包含任意数量的元素。所以我们假设这是Foo:
public void Foo(params string[] args) {
bar(args[0]);
bar(args[1]);
}
新的需求会导致如下更改:
public void Foo(string baz, params string[] args) {
if("do bar".Equals(baz)) {
bar(args[0]);
bar(args[1]);
}
}
问题在于,尽管我已更改了方法签名,但没有出现编译错误,这当然是正确的,但我希望每次调用未指定参数
baz
的Foo
方法时都会出现编译错误。也就是说,如果在更改之前对Foo
的调用是这样的:Foo(p1,p2); //where p1 and p2 are strings
现在需要的是这个:
Foo(baz,p1,p2);
如果不以这种方式更改,
p1
将被分配给baz
,并且参数数组args
的长度为1,将抛出一个OutOfBounds
异常。如何改变签名并确保所有调用代码都相应更新是最好的方式?(真实情况是,
Foo
位于由许多项目共享的程序集中,在构建服务器上自动构建。编译错误因此是检测需要修改以适应更改的所有代码的简单方法。)编辑:正如丹尼尔·曼和其他人指出的那样,上面的示例表明我根本不应该使用params。因此,我应该解释一下,在我的现实例子中,并非总是需要args有两个元素,就Foo的逻辑而言,args可以包含任意数量的元素。所以我们假设这是Foo:
public void Foo(string baz, params string[] args) {
if("do bar".Equals(baz)) {
int x = GetANumberDynamically();
for(int i = 0; i<x; i++)
bar(args[i]);
}
}
int
或其他类型的数据)。这样所有调用该函数的方法都会产生编译错误。当然,更好的方法是使用Resharper或类似工具进行重构。 - dav_iint
而不是一个string
,编译,修改所有调用代码,然后再将int
更改为string
。还要注意的是,if("do bar".Equals(baz)) {
是一个真正糟糕的例子,听起来像是需要另一个重载或更多的重构。 - CodeCaster