c#中的可选参数,引用其他参数
本文关键字:参数 其他 引用 | 更新日期: 2023-09-27 17:52:54
我正试图用c#写一个递归函数,它将接受两个参数,一个数组和一个索引。索引应该在每次递归时改变,但开始是Array的长度- 1。
:
public static int[] UpArray(int[] num, int i = num.Length - 1) {...}
但是,我不能引用num,我可以传递一个布尔值,说明这是否是第一次通过,并在代码中包含一个if子句。但是我想知道是否有更优雅的方式
不,可选参数的默认值是常数。
您可以使用-1
作为默认值,如在注释中建议的,或使其成为一个可空的int,并默认为null:
public static int[] UpArray(int[] num, int? index = null)
{
int realIndex = index ?? num.Length - 1;
...
}
或者更好,只有两个方法:
public static int[] UpArray(int[] num)
{
return UpArray(num, num.Length - 1);
}
private static int[] UpArray(int[] num, int index)
{
...
}
这是假设你不希望外部调用者实际指定索引-你只想在递归调用中这样做。
不需要任何可选参数,整个API就是你真正想要的,而不是让实现细节窥探。
使用不需要索引的重载可能会更优雅。这还允许在需要时将该函数用作代替lambda的方法组,因为lambdas不能利用可选参数的default
public static int[] UpArray(int[] num) { return UpArray(num, num.Length - 1); }
public static int[] UpArray(int[] num, int index)
{
//...
}
这也允许你隐藏内部函数,如果你想强制实现总是在末尾开始:
public static int[] UpArray(int[] num) //...
private static int[] UpArray(int[] num, int index) //...
我建议使用匿名方法:
public static int[] UpArray(int[] num) {
Func<int[], int> f = null;
f = (int[] num, int i) => {
//Do something and then something like:
f(num, num.Length - 1);
};
f(num, num.Length);
}
这种方法的好处是你唯一能够调用的方法是外部的;内部匿名方法是无法调用的。它很干净,不会污染名称空间。当您准备调用该方法时,只有一个方法,并且没有调用错误方法的风险(或者只是试图找出要调用的方法)