c# - 嵌套构造函数(或工厂方法)好吗,或者每个构造函数都应该完成所有初始化工作

标签 c#

<分区>

嵌套构造函数调用重载的 New 或 Factory 样式方法是否是个好主意(从设计 POV 来看)?这主要用于简单的构造函数,其中每个重载都建立在前一个重载的基础上。

MyClass( arg1 ) { 
    _arg1 = arg1; 
    _otherField = true; 
    _color="Blue" 
}
MyClass( arg1, arg2) : this(arg1) { 
    _arg2 = arg2  
}
MyClass( arg1, arg2, arg3) : this(arg1, ar2) { 
    _arg3 = arg3; 
}

或者使用工厂方法:

static NewInstance(arg1 ) { 
   _arg1 = arg1;       
}
static NewInstance(arg1, arg2) {
   f = NewInstance(arg1);
   f._arg2 = arg2;
}
//... and so on

我可以看到双方都有一些缺点

  • 嵌套隐藏了构造函数正在做什么
  • 不嵌套重复所有功能

那么,这样做是个好主意,还是让我为一些我认为不是问题的事情做好了准备。出于某种原因,我觉得这样做很不自在,主要是因为它划分了初始化的责任。

编辑: @Jon Skeet:我现在明白为什么这让我如此困扰。我在倒退!我写了整件事,甚至没有注意到,只是闻到了。我遇到的大多数其他案例(我写的)都按照您推荐的方式进行,但这当然不是我这样做的唯一案例。我确实注意到我做的比较复杂,但我似乎马虎了一些简单的。 我喜欢微编辑。我也喜欢缩写词!

最佳答案

我认为将构造函数链接在一起是合理的,但我采用另一种方式 - 参数较少的版本调用参数较多的版本。这样它就非常清楚发生了什么,所有真正的“逻辑”(超出默认值)都在一个地方。例如:

public Foo(int x, int y)
{
    this.x = x;
    this.y = y;
    precomputedValue = x * y;
}

private static int DefaultY
{
    get { return DateTime.Now.Minute; }
}

public Foo(int x) : this(x, DefaultY)
{
}

public Foo() : this(1, DefaultY)
{
}

请注意,如果您有很多构造函数重载,您可能希望改用静态工厂方法 - 这通常会使代码更清晰,并允许多个方法采用同一组参数,例如

public static XmlDocument FromText(string xml)

public static XmlDocument FromFile(string filename)

关于c# - 嵌套构造函数(或工厂方法)好吗,或者每个构造函数都应该完成所有初始化工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/284896/

相关文章:

c# - 程序集不允许部分信任的调用者

c# - C#中如何删除一个单词的某些字符

c# - 如何从 c# powershell 脚本执行中提取 $lastexitcode

c# - Xamarin 表格 : Image height request ignored inside frame inside relative layout

c# - 我如何在 C#.net 中读取 POSTED Json 数据?

c# - What NpgsqlDbType should be used to clear "Can' t write CLR type”错误

c# - 在 Unity 中检测 Oculus HMD

c# - 速记日期

c# - 如何在 bootstrap alert -bootstrap MVC 中插入换行符

C# - 屏蔽文本框(如何去掉其中的下划线)