kat*_*tit 17 c# code-inspection
这是我的功能.我已将客户端和消息都包装到using子句中,并在运行代码检查时仍然出错.错误指向首先使用行:
public static void Send(MailItem mail)
{
var sender = Membership.GetUser(mail.CreatedBy);
if (sender == null)
{
return;
}
using (var msg = new MailMessage { From = new MailAddress(ConfigurationManager.AppSettings["EmailSender"], ConfigurationManager.AppSettings["EmailSenderName"]) })
{
foreach (var recipient in mail.MailRecipients)
{
var recipientX = Membership.GetUser(recipient.UserKey);
if (recipientX == null)
{
continue;
}
msg.To.Add(new MailAddress(recipientX.Email, recipientX.UserName));
}
msg.Subject = "[From: " + sender.UserName + "]" + mail.Subject;
msg.Body = mail.Body;
if (HttpContext.Current != null)
{
msg.Body += Environment.NewLine + Environment.NewLine + "To reply via Web click link below:" +
Environment.NewLine;
msg.Body += ConfigurationManager.AppSettings["MailPagePath"] + "?AID=" +
ContextManager.CurrentAccount.AccountId + "&RUN=" + sender.UserName;
}
try
{
using (var emailClient = new SmtpClient())
{
emailClient.Send(msg);
}
}
catch (Exception ex)
{
Logger.LogException(ex);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的警告:
警告1 CA2000:Microsoft.Reliability:在方法'Email.Send(MailItem)'中,对象'<> g_ initLocal0'未沿所有异常路径放置.在对对象'<> g _initLocal0'的所有引用都超出范围之前,调用System.IDisposable.Dispose.C:\ CodeWorkspace\Code\Utility\Email.cs 41
Ran*_*832 18
你的问题是这一行:
using (var msg = new MailMessage { From = new MailAddress(ConfigurationManager.AppSettings["EmailSender"], ConfigurationManager.AppSettings["EmailSenderName"]) })
Run Code Online (Sandbox Code Playgroud)
初始化块{ From = ... }在构造对象之后和using块的内部try/finally开始之前执行.
如果MailAddress构造函数(或其参数表达式,或者From如果它是属性访问器的赋值)抛出异常,MailMessage则不会处理.
改成:
using (var msg = new MailMessage())
{
msg.From = new MailAddress(ConfigurationManager.AppSettings["EmailSender"], ConfigurationManager.AppSettings["EmailSenderName"]);
...
}
Run Code Online (Sandbox Code Playgroud)
临时<>g_initLocal0变量是MailMessage在分配之前的名称msg.