c#中的可选参数,引用其他参数

本文关键字:参数 其他 引用 | 更新日期: 2023-09-27 17:52:54

我正试图用c#写一个递归函数,它将接受两个参数,一个数组和一个索引。索引应该在每次递归时改变,但开始是Array的长度- 1。

:

public static int[] UpArray(int[] num, int i = num.Length - 1) {...}

但是,我不能引用num,我可以传递一个布尔值,说明这是否是第一次通过,并在代码中包含一个if子句。但是我想知道是否有更优雅的方式

c#中的可选参数,引用其他参数

不,可选参数的默认值是常数。

您可以使用-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);
}

这种方法的好处是你唯一能够调用的方法是外部的;内部匿名方法是无法调用的。它很干净,不会污染名称空间。当您准备调用该方法时,只有一个方法,并且没有调用错误方法的风险(或者只是试图找出要调用的方法)