调用嵌套的私有构造函数

本文关键字:构造函数 嵌套 调用 | 更新日期: 2023-09-27 18:15:35

如何在公共构造函数中调用私有构造函数?我想公开调用from setter和from 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();
    }

调用嵌套的私有构造函数

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

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

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

这样就可以保证它们将被您编写的任何构造函数初始化。我想你也可以把它们设为只读。

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

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

您可以使用以下语法来调用另一个构造函数,这是。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();
}