从C#中的构造函数调用实例方法

时间:2011-10-14 08:39:16

标签: c# constructor initialization static-methods

我有一个相当冗长的构造函数,它正在执行各种初始化工作,因此我想将一些工作分解为一些函数。这让我想知道是否应该制作上述函数实例或静态方法。我理解从构造函数调用虚函数的风险,但我也认为在一个没有100%实例化的对象上调用实例方法是不对的。当然,这是一个矛盾。

我对这个问题的人们的意见感兴趣。我还发现通过使用静态方法返回初始化变量,我可以使成员目标只读。以下是我的方案的简化说明。

public class A
{
   private readonly string _foo;

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

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

2 个答案:

答案 0 :(得分:4)

这在构造函数中调用实例方法非常正常,而且还有进行初始化的方法。所以基本上这是一种用于减少构造函数方法体的Extract Method重构,所以你将初始化的一部分提取到一个单独的方法中,构造函数知道保存输入参数等等......

关于static修饰符..有时候(我相信没有其他方法可以重构,因为这看起来不太好 - 从我的角度来看)你需要调用一个方法来在基础构造函数中传递结果所以在这种情况下,您必须将其标记为静态以在静态上下文中调用,在其他情况下,不使用静态修饰符

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

private static ILog GetLogger() ...

答案 1 :(得分:1)

我可以理解只在构造函数中使用静态成员的愿望,因为它可以使代码更直接地使用而不必跟踪已经初始化的内容和没有内容的内容,但是你可能会使事情变得不必要地复杂化为自己。只要你有充分的理由在C#中调用实例方法就可以了。例如,如果您有许多构造函数都执行某些常见任务,那么创建单个成员函数来完成工作比复制并粘贴每个构造函数的代码更容易。您还可以想象一种情况,可以在构造函数之外重用该方法,例如将类重置为初始化状态。

静态方法很好,但只能在你做一些孤立工作并将结果放入成员变量的情况下工作。它提供了非常干净,功能性的编程般的感觉。但是,如果任何工作涉及阶级状态,那将会变得丑陋。