2011-10-14 77 views
5

我有一個相當冗長的構造函數,它執行各種初始化工作,因此我想將這些工作分解到一些函數中。這導致我懷疑我是否應該製作所述的函數實例或靜態方法。我明白從構造函數調用虛函數的風險,但我也認爲在未實例化的對象上調用實例方法是不對的。這當然是矛盾的。從C中的構造函數調用實例方法#

我會對這個問題的意見感興趣。我還發現,通過使用靜態方法返回初始化變量,我可以使成員目標是隻讀的。以下是我的場景的簡單說明。

public class A 
{ 
    private readonly string _foo; 

    public A() 
    { 
     _foo = InitialiseFoo(); 
    } 

    private static InitialiseFoo() 
    { 
     // Do stuff 
     return new string ("foo"); 
    } 
} 
+1

爲什麼你有一個冗長的構造函數?這不是構造函數應該如何。您應該使用方法來執行冗長的操作。當你嘗試使用一些API並且這個API在其構造函數中執行數據庫訪問和東西並且可能拋出異常和東西時總是非常令人沮喪。做到這一點。這真的很煩人。構造函數應該很簡單。 –

+0

我完全同意你的看法,但我正在編寫一個windows服務,它需要首先從配置文件中獲取它的服務名稱。你只能在它的構造函數中設置一個服務的名字,所以我有點困惑。 – user738134

回答

4

這是非常正常調用實例方法在構造,而且方法,做初始化。所以基本上這是一種減少構造函數方法主體的refactorig,所以你將初始化的一部分提取到單獨的方法中,並且構造函數知道保存輸入參數等。

關於static修飾符..有時(我相信當沒有其他重構方法時,因爲這看起來不太好 - 從我的角度來看),您需要調用一個方法將結果傳遞給基礎構造函數,因此在這種情況下,您必須將其標記爲靜態以調用在其他情況下,靜態情況下離開它沒有static修飾符

public A() 
: base(GetLogger()) 
{ 
} 

private static ILog GetLogger() ... 
+0

+1提取提取方法,這就是所有這一切是 –

1

我可以理解的願望,只能在構造函數,貝科使用靜態成員使用它可以使代碼更直接地使用,而無需跟蹤已初始化和未初始化的代碼,但是您可能會使自己的事情變得不必要地複雜化。在C#中調用實例方法是好的,只要你有充分的理由去做。例如,如果您有許多構造函數都執行一些常見任務,則創建單個成員函數以執行該工作比複製並粘貼每個構造函數的代碼更容易維護。你也可以想象一下這種情況,可以在構造函數之外重用該方法,例如將類重設爲初始化狀態。

靜態方法很好,但只適用於您正在做一些孤立工作並將結果放入成員變量的情況。它提供了一個非常乾淨,功能類似於編程的感覺。但是,如果任何一項工作涉及到階級狀態,它將會變得醜陋。

+0

'如果你有一些構造函數,所有執行一些常見的任務' - 它通常更容易鏈接這些調用'MyCTor:this(arg1,arg2)'從構造函數。 – nicodemus13