c# - 当一个构造函数实现另一个构造函数时有好处还是坏处?

标签 c# constructor

如果我有这样的类(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/

相关文章:

java - 在 Java 中,如何通过对象的构造函数将对象添加到数组?

java - 调用构造函数是否意味着创建对象?

c++ - 为什么显式允许默认构造函数和具有 2 个或更多(非默认)参数的构造函数?

java - 如何测试一个构造函数会抛出非法状态异常?

c# - 是什么导致 Web 服务 URL 和 namespace 之间存在差异?

c# - 如何使用 C# 在源代码中查找图像标签?

c# - 检查SIM卡是否存在

c# - azure 函数将多个文件上传到 blob 存储

C# 从 html 字符串打印 html 文档

java - 什么时候在java中使用Long vs long?