2008-09-20 107 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()) {}