1

我学习 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;
    }


}
4

5 回答 5

3

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

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

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

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

于 2012-04-22T12:36:24.983 回答
2

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

这没有对错之分,我们使用重载函数使使用更简单,因此在不需要时无需传递空参数。

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

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

于 2012-04-22T12:41:08.707 回答
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)。

于 2012-04-22T12:33:09.803 回答
1

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

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

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

但是调用双参数构造函数的现有实现是更简洁的解决方案,因为它遵循“不要重复自己”的原则。

于 2012-04-22T12:40:10.253 回答