2012-07-27 24 views
0

如何將進度條聲明爲可選參數?如何在C#中將對象聲明爲可選參數?

下面是函數:

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

     .... 

    } 

該函數有四個參數。只有int number和標籤l應該是強制性的。 time已經是可選的,但我不知道如何使新的進度條可選。 該函數返回一個數字的因子,它使用標籤來顯示它。

進度條應顯示堆棧的狀態,時間應該是該函數的工作速度,但這兩者應該是可選的。

我已經完成了這個功能,但是我仍然需要弄清楚如何讓進度條成爲可選項。

回答

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方法只有知道如何產生一個階乘數序列。

+0

謝謝!它的工作原理 – robertpas 2012-07-27 06:28:23

+0

@ user1556775:儘管如此,請參閱(編輯)我的答案的其餘部分。就關注點分離而言,您的設計可以得到很大改善。 – 2012-07-27 06:30:30

0

進度從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 
}