【发布时间】:2015-01-14 10:07:52
【问题描述】:
我发现在某些情况下,构造函数中有很多代码,或者一个类有两个或多个具有可比代码的构造函数。在这些情况下,我经常创建一个私有方法。前者提高可读性,后者防止重复代码。
在某些情况下,这会产生一个只能从构造函数调用的私有方法(无论出于何种原因)。有没有办法强制执行?我可以想象做这样的事情:
using System.Diagnostics;
public class Foo
{
private bool _constructing = true;
private Foo()
{
_constructing = false;
}
public Foo(string someString) : this()
{
// constructor-specific code
Initialize();
}
public Foo(double someDouble) : this()
{
// constructor-specific code
Initialize();
}
private void Initialize()
{
Debug.Assert(!_constructing, "Initialize method should only be called from constructor");
// shared code
}
}
但这感觉有点笨拙。谁有更好的建议?
编辑:将构造函数链接添加到示例;我的意思是在原始示例中使用它。
编辑:我认为我在最初的问题中遗漏了一点 - 虽然在某些情况下链接构造函数确实提供了解决方案,但链接代码总是在您链接的构造函数中的代码之前执行(顺便提一下, 这就是为什么上面的例子不起作用)。在某些情况下,您想要执行共享代码的某些部分,然后执行其他操作。我将添加另一个示例来反映这一点:
using System.Diagnostics;
public class Foo
{
private bool _constructing = true;
public Foo(string someString)
{
// constructor-specific pre-processing code
Initialize();
// constructor-specific post-processing code
_constructing = false;
}
public Foo(double someDouble)
{
// constructor-specific pre-processing code
Initialize();
// constructor-specific post-processing code
_constructing = false;
}
private void Initialize()
{
Debug.Assert(!_constructing, "Initialize method should only be called from constructor");
// shared code
}
}
【问题讨论】:
-
您可以链接构造函数,这样就不需要单独的方法。这假设在不同的构造函数中发生了类似的事情......stackoverflow.com/questions/1814953/…
-
将
_constructing标记为readonly。这样您就可以确保没有其他代码能够将其还原为true。 -
由于该方法是私有的,我不明白为什么您需要做任何事情,除了在方法旁边添加注释说它只能从构造函数中调用。
-
使用构造函数链。如果您需要初始化
readonly字段,则Initialize方法没有用。 -
我实际上是想在示例中使用构造函数链接;忘记仔细检查我自己的示例代码 - 抱歉!
标签: c# constructor assert