如何在公共场所调用私有构造器?我想公开调用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();
}
答案 0 :(得分:2)
作为构造函数链的替代方法:
如果您希望所有构造函数初始化client
和message
,您应该将初始化从默认构造函数移动到定义私有字段的位置,如下所示:
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();
}