2011-10-14 51 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