2017-01-29 54 views
1

兩個SmtpClient MAILMESSAGE和實現IDisposable所以我想做出這樣的我是否正確地使用C#語句?

using (SmtpClient smtpClient = new SmtpClient("xxx", 587)) 
{ 
    smtpClient.Credentials = new System.Net.NetworkCredential("email", "pass"); 
    smtpClient.EnableSsl = true; 

    using (MailMessage mail = new MailMessage()) 
    { 
     mail.Subject = "subject"; 
     mail.From = new MailAddress("email", "name"); 
     mail.To.Add(new MailAddress("email")); 
     mail.Body = "body"; 
     mail.IsBodyHtml = true; 

     smtpClient.Send(mail); 
    } 
} 

我的代碼的我是對使用2 using語句或只有第一個using語句需要做什麼呢?

謝謝

+3

如果兩者都需要處置,那麼兩者的「使用」是必要的。 –

+0

除非你在使用後有特定的理由放棄,否則不需要(當方法/類被丟棄時它們將被處置)。這就是說,嵌套'使用'或多或少冗餘 – Enfyve

+3

上面的評論是錯誤的,你應該忽略它。 –

回答

1

當嵌套using語句,它更習慣做無壓痕:

using (SmtpClient smtpClient = new SmtpClient("xxx", 587)) 
using (MailMessage mail = new MailMessage()) 
{ 
    smtpClient.Credentials = new System.Net.NetworkCredential("email", "pass"); 
    smtpClient.EnableSsl = true; 

    mail.Subject = "subject"; 
    mail.From = new MailAddress("email", "name"); 
    mail.To.Add(new MailAddress("email")); 
    mail.Body = "body"; 
    mail.IsBodyHtml = true; 

    smtpClient.Send(mail); 
} 

這並不總是可能的,因爲你有時需要做的第一和第二using之間的一些處理。儘管如此,它在你的例子中起作用。

+0

謝謝,你的代碼看起來更好 –

+0

這是否意味着一旦使用塊結束,其中使用'using'語句實例化的所有對象(就像smtpClient)也會被處理? –

+1

@ HeeroYuy是的,絕對正確。順便說一下,這不是什麼魔術。它的工作原理與嵌套'if's沒有大括號一樣,如'if(a> b)if(b> c)if(d == e){/ * do stuff * /}'。同樣的,如果你添加大括號,產生'if(a> b){if(b> c){if(d == e){/ * do stuff * /}}}'。 – Lumen

1

有多個使用語句沒有什麼固有的錯誤。它將物體的壽命保持在最低限度,這不是一件壞事。