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

5
我有一个相当冗长的构造函数,它执行各种初始化工作,因此我想将一些工作提取到一些函数中。这让我想知道是否应该将这些函数设置为实例方法或静态方法。我理解从构造函数调用虚函数的风险,但我也认为在尚未完全实例化的对象上调用实例方法是不正确的。这肯定是个矛盾。
我很想听听大家对这个问题的看法。我还发现,通过使用静态方法返回初始化变量,我可以使成员目标只读。这是我情境的一个简化示例。
public class A
{
   private readonly string _foo;

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

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

1
为什么你有一个冗长的构造函数?那不是构造函数应该的方式。你应该使用方法来执行冗长的操作。当你尝试使用一些API时,如果这个API在构造函数中执行数据库访问等操作并可能抛出异常等,则总是非常令人沮丧。不要这样做。这真的很烦人。构造函数应该简单。 - Darin Dimitrov
我完全同意你的看法,但我正在编写一个Windows服务,它需要首先从配置文件中获取其服务名称。你只能在构造函数中设置服务的名称,所以我有点束手无策。 - Mr Davies
2个回答

4
这在构造函数中调用实例方法并且该方法执行初始化操作是很正常的。基本上,这是一种提取方法的重构方式,以减少构造函数的代码量。因此,您需要将一部分初始化代码提取到单独的方法中,构造函数则负责保存输入参数等内容。
关于static修饰符...有时候(我认为当没有其他重构方式时,因为从我的角度来看这样看起来不好),您需要调用一个方法来传递结果给基础构造函数,所以在这种情况下,您必须将其标记为静态,以在静态上下文中调用,在其他情况下则不需要使用静态修饰符。
public A() 
: base(GetLogger())
{
}

private static ILog GetLogger() ...

1

我能理解只在构造函数中使用静态成员的愿望,因为这确实可以使代码更加简单易用,而无需跟踪已初始化和未初始化的内容,但是您可能会让事情变得不必要复杂。在C#中调用实例方法是可以接受的,只要您有充分的理由这样做。例如,如果您有多个构造函数都执行一些常见任务,则创建一个单独的成员函数来完成工作比为每个构造函数复制代码更容易维护。您还可以想象一种情况,即该方法可以在构造函数之外重复使用,例如将类重置为初始化状态。

静态方法很好,但仅适用于您正在进行某些隔离工作并将结果放入成员变量的情况。它提供了非常干净的、类似于函数式编程的感觉。但是,如果涉及到类状态中的任何工作,它将变得混乱不堪。


如果你有一些构造函数都执行一些共同的任务,通常最好使用从构造函数调用 MyCTor : this(arg1, arg2) 进行链接。 - nicodemus13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接