2013-05-28 227 views
1

如何在公共方法中調用私有構造函數?我想從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

你的第二句話對我來說完全不清楚。如果你在一起討論鏈接構造函數,請參閱http://stackoverflow.com/questions/985280/can-i-call-a-overloaded-constructor-from-another-constructor-of-the-same-class-i ?rq = 1 –

+0

這正是我想要的,謝謝喬恩!對不起,缺少咖啡。 –

回答

1

您可以使用下面的語法來調用另一個構造,它是一個淨功能:

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(); 
} 
2

作爲替代構造器鏈接:

如果你想要的所有構造函數初始化clientmessage您應該將初始化從默認構造函數移動到定義私有字段的位置,如下所示:

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

這樣你就可以保證它們會被你碰巧寫的任何構造函數初始化。我認爲你也可以讓他們只讀。

注意:只有在構建時初始化SMTPServer,例如如果它是一個返回不依賴於其他字段的值的屬性,它纔會起作用。否則,您可能需要爲另一個字段使用另一個字段,該字段與另外兩個字段同時聲明和初始化。

類似的字段按照它們出現在類定義中的順序進行初始化(顯然這對於​​知道非常重要)。