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

时间:2015-06-02 19:07:05

标签: c#

我试图在C#中编写一个递归函数,它将采用两个参数,一个数组和一个索引。索引应该在每次递归时改变,但是开始是数组的长度 - 。

像这样:

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

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

3 个答案:

答案 0 :(得分:9)

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

您可以使用-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就是您真正想要的,而不是让实现细节透视。

答案 1 :(得分:1)

我建议使用匿名方法:

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);
}

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

答案 2 :(得分:1)

使用不需要索引的重载可能更优雅。这也将允许函数在需要时用作方法组来代替lambda,因为lambdas不能使用可选参数&#39;默认值

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) //...