如果我有这样的类(class):
public class Foo
{
public IEnumerable<Bar> Bars { get; set; }
public Foo()
{
Bars = new List<Bar>();
}
}
在某个阶段,我重构了类并添加了一个辅助构造函数来实现第一个构造函数,如下所示:
public class Foo
{
public IEnumerable<Bar> Bars { get; set; }
// some more properties were added
public Foo()
{
Bars = new List<Bar>();
}
public Foo(string parameter): this()
{
.... some code here
}
}
我也可以这样写:
public class Foo
{
public IEnumerable<Bar> Bars { get; set; }
// some more properties were added too
public Foo()
{
InitilizeFoo();
}
public Foo(string parameter)
{
InitilizeFoo();
.... some code here
}
private void InitializeFoo()
{
Bars = new List<Bar>();
}
}
看到这两种方法都适用于这种情况,使用其中一种方法优于另一种方法有什么好处或缺点吗?
继承构造函数是否更有效并使代码执行得更快,或者是否存在我不知道如何使第二个实现更有效的缺点?
最佳答案
让一个构造函数调用另一个构造函数的主要好处之一是您可以通过这种方式设置只读字段,而不能通过调用非构造函数方法来实现。
例如:
public class Foo
{
private readonly int myNumber;
public Foo() : this(42)
{
}
public Foo(int num)
{
myNumber = num;
}
}
在性能方面,调用另一个构造函数的效率可能不会比调用另一个方法高或低,但在我看来,一个构造函数调用另一个构造函数比调用一个单独的私有(private)方法更具可读性点将由构造函数调用。
当然,在某些情况下,使用单独的方法是有意义的,而且它本身肯定不是“错误”的。对于大多数用途而言,链接构造函数对许多人来说读起来更好,并且不会对性能产生负面影响。
更新:我对每种方式执行了 10,000,000 次迭代(链接初始化方法与私有(private)初始化方法),结果非常接近,几乎无法区分:
Initializer Method took: 84 ms for 10,000,000 iterations, 8.4E-06 ms/each.
Chained Constructors took: 81 ms for 10,000,000 iterations, 8.1E-06 ms/each.
实际上,就性能而言,这两种方式几乎都没有好处。主要好处是使用链式构造函数,您可以设置 readonly
字段,并且在大多数情况下它更具可读性。
关于c# - 当一个构造函数实现另一个构造函数时有好处还是坏处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10838251/