如何在C#中将对象声明为可选参数?

时间:2012-07-27 06:22:28

标签: progress-bar optional-parameters

如何将进度条声明为可选参数?

这是功能:

public int Factorial(int number, System.Windows.Forms.Label l, System.Windows.Forms.ProgressBar newprogressbar, int time=0)
    {

      ....

    }

该功能有四个参数。只有int number和标签l应该是必需的。 time已经是可选的,但我不知道如何使新的进度条可选。 该函数返回数字的 factorial ,并使用标签显示它。

进度条应该显示堆栈的状态,时间应该是函数的工作速度,但这两个应该是可选的。

我已经完成了这个功能,但我仍然需要弄清楚如何使进度条可选。

2 个答案:

答案 0 :(得分:3)

将声明任何其他参数设置为可选的方法相同 - 指定默认值。但是,默认值具有是一个常量,对于string以外的引用类型,它基本上意味着null

public int Factorial(int number, Label l, ProgressBar newProgressBar = null,
                     int time = 0) {

但我个人会改变设计。您可以传入一个代理,而不是让Factorial知道“如何计算因子值”和“如何显示进度”,而是传递代理:

public int Factorial(int number, Action<int> progressAction, int time = 0) {

...然后在循环的每次迭代中调用该进度操作(这是我假设您使用进度条执行的操作)。

这改善了关注点的分离。如果您不想在所有情况下都指出进度,可以将progressAction默认为null

另一种选择是完全反转控件,并将Factorial视为一系列值 - 使用迭代器块轻松完成:

public IEnumerable<int> Factorial()
{
    for (...)
    {
        // Do work
        yield return currentValue;
    }
}

您可以单独施加时间限制(我假设是time参数的用途?),这样调用者可以计算出迭代次数以及如何处理结果。 Factorial方法知道如何生成一系列阶乘数。

答案 1 :(得分:0)

ProgressBar最终派生自System.Object,因此您只需编写

即可
public int Factorial(int number, System.Windows.Forms.Label l, 
    System.Windows.Forms.ProgressBar newprogressbar = null, int time=0)

要检查方法是否已定义,只需写入

if (newprogressbar != null)
{
    // Do something with newprogressbar
}