【问题标题】:Calling instance method from a constructor in C#从 C# 中的构造函数调用实例方法
【发布时间】:2011-10-14 08:39:16
【问题描述】:

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

我很想听听人们对此事的看法。我还发现,通过使用静态方法返回初始化变量,我可以将成员目标设为只读。这是我的场景的简化说明。

public class A
{
   private readonly string _foo;

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

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

【问题讨论】:

  • 为什么有一个冗长的构造函数?这不是构造函数应有的样子。您应该使用方法来执行冗长的操作。当您尝试使用某些 API 并且此 API 在其构造函数中执行数据库访问和内容并可能引发异常和内容时,总是非常令人沮丧。去做吧。这真的很烦人。构造函数应该很简单。
  • 我完全同意你的观点,但我正在编写一个 Windows 服务,它需要首先从配置文件中获取它的服务名称。您只能在它的构造函数中设置服务的名称,所以我有点卡住了。

标签: c# constructor initialization static-methods


【解决方案1】:

在构造函数中调用实例方法是很正常的,而且是在做初始化的方法。所以基本上这是一种Extract Method 重构以减少构造函数方法体,因此您将部分初始化提取到单独的方法中,并且构造函数知道保存输入参数等...

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

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

private static ILog GetLogger() ...

【讨论】:

    【解决方案2】:

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

    静态方法很好,但仅在您进行一些孤立的工作并将结果放入成员变量的情况下才有效。它提供了一种非常干净、类似函数式编程的感觉。但是,如果任何工作涉及类状态,它就会变得丑陋。

    【讨论】:

    • if you have a number of constructors that all perform some common tasks- 通过从构造函数调用 MyCTor : this(arg1, arg2) 来链接这些通常更简洁。
    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2013-08-10
    • 2013-03-05
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多