2017-01-29 33 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

有多个使用语句没有什么固有的错误。它将物体的寿命保持在最低限度,这不是一件坏事。