需要了解重载的构造函数

时间:2012-04-22 12:28:23

标签: c#

我研究C#并且我试图理解重载的构造函数,它是如何工作的以及像链式调用一样使用它们的点?为什么只有一个带有所有必要参数的构造函数?下面我为我正在使用的任务提供了一些帮助代码,我需要一些帮助来理解所有这些构造函数的要点。提供一些帮助!谢谢!

    public class Email
{
    //private email
    private string m_personal;
    //work mail
    private string m_work;

    public Email()
    {
    }

    public Email(string workMail) : this(workMail, string.Empty)
    {
    }

    public Email(string workMail, string personalMail)
    {
        m_work = workMail;
        m_personal = personalMail;
    }

    public string Personal
    {
        //private mail
        get { return m_personal; }

        set { m_personal = value; }
    }

    public string Work
    {
        get { return m_work; }

        set { m_work = value; }
    }

    public string GetToStringItemsHeadings
    {
        get { return string.Format("{0,-20} {1, -20}", "Office Email", "Private Email"); }
    }

    public override string ToString()
    {
        string strOut = string.Format("{0,-20} {1, -20}", m_work, m_personal);
        return strOut;
    }


}

5 个答案:

答案 0 :(得分:3)

  

为什么只有一个带有所有必要参数的构造函数?

如果您班级的用户只对某些参数感兴趣,该怎么办?使用您的示例,如果有人没有个人电子邮件怎么办?他们应该通过null还是string.Empty?这种类型级知识最好由类型本身来处理。

通过仅使用工作电子邮件公开额外的构造函数,您实际上是在告诉您的班级消费者“没有个人电子邮件?别担心,我会处理它”

最重要的是,链接定义自然有助于避免代码冗余。

答案 1 :(得分:2)

这不是Constructors。所有类型的重载函数都可以简化库的使用。当我们编写一个类时,我们将把所有复杂性封装在一个黑盒子中,这可以用一些已知的best Practices来实现。好的例子是你可以轻松使用的.NET库(记住那些重载的函数/构造函数)。

这不是对或错,我们使用重载函数使用法更简单,因此在不需要时不需要传递null参数。

其次,我们调用具有大多数参数的函数,这些参数由具有较少参数的下一个函数嵌套以减少Redundancy。我的意思是避免在所有版本的函数中复制/粘贴相同的代码。

我认为,由于该模式被广泛接受和使用,下一代.NET将以某种方式隐藏这个冗余版本,我们只使用最多的参数编写函数。

答案 2 :(得分:1)

重点是避免重复代码,因为它可以帮助你避免这种情况:

public Email(string workMail)
{
    m_work = workMail;
    m_personal = string.Empty;
}

public Email(string workMail, string personalMail)
{
    m_work = workMail;
    m_personal = personalMail;
}

考虑到你的构造函数可以做的不仅仅是分配字段。

它是如何工作的?您可以尝试,调试并学习它。我不确定,但我认为它会首先调用重载的,然后调用构造函数的代码。在您的场景中,调用Email(string workMail)将调用第一个Email(string workMail,string personalMail)。

答案 3 :(得分:1)

答案 4 :(得分:1)

我想说第二个构造函数主要是为了方便起见,在没有个人邮件地址的情况下更容易使用类。然后,该类的用户只需要指定工作地址,并且类本身将通过为该字段设置合理的默认值来处理非会员个人地址。如果缺少该参数,则该类的用户将被用于填充string.Empty以丢失个人邮件地址。

构造函数实现为对另一个构造函数的调用,以避免重复代码。它也可以写成

public Email(string workMail)
{
    m_work = workMail;
    m_personal = string.Empty;
}

但调用双参数构造函数的现有实现是更清晰的解决方案,因为它遵循"不要重复自己"原理