2008-09-20 136 views
6

在C#多個構造函數,如果你有多個構造函數,你可以這樣做:複雜的邏輯

public MyClass(Guid inputId, string inputName){ 
    // do something 
} 

public MyClass(Guid inputId): this(inputId, "foo") {} 

的想法當然是代碼重用。然而,當需要一些複雜的邏輯時,最好的方法是什麼?說我想這個構造:

public MyClass(MyOtherClass inputObject) 
{ 
    Guid inputId = inputObject.ID; 
    MyThirdClass mc = inputObject.CreateHelper(); 
    string inputText = mc.Text; 
    mc.Dispose(); 
    // Need to call the main Constructor now with inputId and inputText 
} 

這裏需要說明的是,我需要創建一個對象,被使用後丟棄。 (澄清:不是立即,但我必須調用Dispose()而不是等待垃圾收集)

但是,我沒有看到一種方法來再次調用基構造函數,如果我在我的重載構造函數中添加一些代碼。有沒有辦法從超載的內部調用基礎構造函數?

或者是有可能使用

public MyClass(MyOtherClass inputObject): this(inputObject.ID, 
               inputObject.CreateHelper().Text) 
{} 

這會自動從CreateHelper處置所產生的對象()?

編輯:感謝這麼遠。兩個問題:我不控制MyOtherClass,我沒有擴展方法(只有.NET 3.0 ...)。我這樣做,雖然控制我自己的類,並且因爲我剛開始寫它,我沒有問題,重構的構造函數,如果有一個很好的方法。

回答

17

用來解決這個問題的最常見的模式是有你的構造函數調用初始化()方法,但你剛纔給的例子,並補充說,你叫像下面的代碼靜態方法,會做的伎倆。

public MyClass(MyOtherClass inputObject): this(inputObject.ID, GetHelperText(inputObject) {} 

private static string GetHelperText(MyOtherClass o) 
{ 
    using (var helper = o.CreateHelper()) 
     return helper.Text; 
} 
1

的對象僅垃圾收集運行時被自動地設置。如果你想在處置儘快它出去的範圍運行,你應該使用using塊:

using (MyThirdClass mc = inputObject.CreateHelper()) 
{ 
    // do something with mc 
} 

這真的是越來越有型有款的問題,並沒有真正的核心你有問題。

+0

因爲他說*有*在使用後被處置掉,所以我把它當作「立即使用後」的意思,在這種情況下,使用塊將是必要的。 – 2008-09-20 23:18:36

+0

這並沒有真正解決所提出的問題,即如何對參數執行邏輯操作,並仍然使用構造函數():this()模式進入另一個構造函數。確實是 – 2008-09-20 23:18:40

+0

。對不起,如果我不清楚。我的問題是,我需要再次與我的基礎構造函數與數據,我必須處置mc,而不是等待垃圾收集。你和我的例子基本上是一樣的,使用和調用Dispose()顯式地使問題沒有區別。 – 2008-09-20 23:27:21

2

我看不到任何理由認爲在構造函數中創建對象會自動處理對象。是的,你的對象將立即出去的範圍,可用於垃圾收集,但是這肯定是不一樣的佈置。

真的是沒有做的正是你想做的事的好方法,但整個事情感覺就像它可以從一些重構中受益。當我發現自己試圖向後彎曲以創建構造函數重載時,通常就是在我自己的代碼中。

如果你有控制權MyOtherClass,爲什麼不通過增加處理處置getter方法簡化訪問該文本屬性:

public class MyOtherClass 
{ 
    //... 
    public string GetText() 
    { 
     using (var h = CreateHelper()) 
      return h.Text; 
    } 
} 

,如果你不控制你可以使用MyOtherClass擴展方法

public static class MyOtherClassExtensions 
{ 
    public static string GetText(this MyOtherClass parent) 
    { 
     using(var helper = parent.CreateHelper()) 
     { 
      return helper.Text; 
     } 
    } 
} 

然後,當然,在你的構造函數,你可以安全地調用

public MyClass(MyOtherClass inputObject): this(inputObject.ID, inputObject.GetText()) {}