调用嵌套的私有构造函数

时间:2013-05-28 09:37:32

标签: c# constructor

如何在公共场所调用私有构造器?我想公开调用setter和setter调用对象初始化器。

    private MyMailer() // objects initializer
    {
        client = new SmtpClient(SMTPServer);
        message = new MailMessage {IsBodyHtml = true};
    }

    private MyMailer(string from) //from setter
    {
        SetFrom(from);
    }

    public MyMailer(string from, string to, string cc, string bcc, string subject, string content)
    {
        foreach (string chunk in to.Split(new string[] {";"}, StringSplitOptions.RemoveEmptyEntries))
        {
            AddTo(chunk);    
        }

        foreach (string chunk in cc.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries))
        {
            AddCC(chunk);
        }

        foreach (string chunk in bcc.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries))
        {
            AddBCC(chunk);
        }
        SetSubject(subject);
        SetMessage(content);
        Send();
    }

2 个答案:

答案 0 :(得分:2)

作为构造函数链的替代方法:

如果您希望所有构造函数初始化clientmessage,您应该将初始化从默认构造函数移动到定义私有字段的位置,如下所示:

private readonly SmtpClient client = new SmtpClient(SMTPServer);
private readonly MailMessage message = new MailMessage {IsBodyHtml = true};

通过这种方式,您可以确保它们将由您碰巧编写的任何构造函数初始化。我想你也许可以把它们简单化了。

注意:只有在构造时初始化SMTPServer时才会起作用,例如,如果它是一个返回不依赖于其他字段的值的属性。否则,您可能需要为其使用另一个字段,该字段与其他两个字段一样被声明和初始化。

这样的字段按照它们出现在类定义中的顺序进行初始化(这显然非常重要)。

答案 1 :(得分:1)

您可以使用以下语法调用另一个构造函数,它是.Net功能:

private MyMailer() // objects initializer
{
    client = new SmtpClient(SMTPServer);
    message = new MailMessage {IsBodyHtml = true};
}

private MyMailer(string from) //from setter
    : this() // calls MyMailer()
{
    SetFrom(from);
}

public MyMailer(string from, string to, string cc, string bcc, string subject, string content)
    : this(from) // calls MyMailer(from)
{
    foreach (string chunk in to.Split(new string[] {";"}, StringSplitOptions.RemoveEmptyEntries))
    {
        AddTo(chunk);    
    }

    foreach (string chunk in cc.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries))
    {
        AddCC(chunk);
    }

    foreach (string chunk in bcc.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries))
    {
        AddBCC(chunk);
    }
    SetSubject(subject);
    SetMessage(content);
    Send();
}