从c#的构造函数中调用实例方法
本文关键字:调用 实例方法 构造函数 | 更新日期: 2023-09-27 18:11:10
我有一个相当长的构造函数,它执行各种初始化工作,因此我想将其中一些工作分解为一些函数。这导致我怀疑我是否应该使上述函数实例或静态方法。我理解从构造函数调用虚拟函数的风险,但我也认为在没有100%实例化的对象上调用实例方法是不对的。这显然是自相矛盾的。
我很想听听大家对这件事的看法。我还发现,通过使用静态方法返回一个初始化的变量,我可以使成员目标只读。下面是我的场景的一个简化说明。public class A
{
private readonly string _foo;
public A()
{
_foo = InitialiseFoo();
}
private static InitialiseFoo()
{
// Do stuff
return new string ("foo");
}
}
在构造函数中调用实例方法是很正常的,而且该方法正在进行初始化。因此,基本上这是一种提取方法重构,以减少构造函数方法体,所以你将初始化的一部分提取到一个单独的方法中,构造函数知道保存输入参数等。
关于static
修饰符…有时(我相信当没有其他方法重构时,因为从我的角度来看,这看起来不好)你需要调用一个方法来传递基构造函数的结果,所以在这种情况下,你必须将它标记为静态,以便在静态上下文中调用;在其他情况下,不使用静态修饰符
public A()
: base(GetLogger())
{
}
private static ILog GetLogger() ...
我可以理解在构造函数中只使用静态成员的愿望,因为它确实使代码更容易使用,而不必跟踪哪些已初始化,哪些未初始化,但您可能会使事情变得不必要的复杂。在c#中调用实例方法是可以的,只要你有一个很好的理由。例如,如果您有许多构造函数,它们都执行一些常见的任务,那么创建单个成员函数来完成这项工作比为每个构造函数复制和粘贴代码更容易维护。您还可以想象这样一种情况:该方法可以在构造函数之外被重用,例如将类重置为初始化状态。
静态方法很好,但是只有在您要做一些孤立的工作并将结果放入成员变量的情况下才有效。它提供了一种非常干净、类似函数式编程的感觉。然而,如果任何工作涉及到类状态,它将变得很难看。