【发布时间】:2018-03-06 07:47:06
【问题描述】:
var smtp = new SmtpClient
{
Host =smtpHost,
Port = smtpPort,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, mailFromPassword)
};
using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = subject,
Body = body,
}
)
{
smtp.Send(message);
}
最后一个括号(从底部算起 4 行)关闭 using 语句。我必须在这里遗漏一些明显的东西,但是代码可以编译,通过 resharper 并且 var 消息在 using 语句之外使用。事实上,如果我把它放在 using 语句中,它就无法构建。
其实来自这个https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement
" using 语句确保即使在调用对象上的方法时发生异常,也会调用 Dispose。您可以通过将对象放在 try 块中,然后在 finally 块中调用 Dispose;在事实上,这就是编译器翻译 using 语句的方式。前面的代码示例在编译时扩展为以下代码(注意额外的花括号以创建对象的有限范围):"
消息应该已经超出范围并且可能已被处理。
【问题讨论】:
-
"最后一个括号(从底部算起 4 行)结束了 using 语句。"不,它没有。它关闭声明,然后开始实际的语句块(包含单个语句
smtp.Send)。 -
smtp.Send(message)在using块内。之前的{}只是MailMessage的初始化。 -
我已重新格式化您的代码以使上述 cmets 清晰 :)
-
在 using 声明中声明的变量仍在范围内,实际上您拥有它的方式实际上是推荐的方法,来自docs -
it is generally better to instantiate the object in the using statement and limit its scope to the using block.。
标签: c# using-declaration