【问题标题】:Code inspection says I need to dispose object. Which one?代码检查说我需要处理对象。哪一个?
【发布时间】:2011-09-22 08:17:42
【问题描述】:

这是我的功能。我已经将客户端和消息都包装到 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);
                }
            }
        }

这是我收到的警告:

警告 1 CA2000: Microsoft.Reliability:方法中 'Email.Send(MailItem)', 对象 'g_initLocal0' 未释放 沿着所有异常路径。称呼 System.IDisposable.Dispose 对象 'g_initLocal0' 在所有之前 对它的引用不在 范围。 C:\CodeWorkspace\Code\Utility\Email.cs 41

【问题讨论】:

  • 那么你的代码中的第 41 行是什么?
  • @BrokenGlass:他的代码第 41 行的是什么?
  • @Mehrdad:不可能说考虑到这只是文件中代码的一部分。
  • 我在帖子中说过错误指向第一个“使用”行

标签: c# code-inspection


【解决方案1】:

你的问题是这一行:

using (var msg = new MailMessage { From = new MailAddress(ConfigurationManager.AppSettings["EmailSender"], ConfigurationManager.AppSettings["EmailSenderName"]) }) 

初始化块{ From = ... }在对象被构造之后和using块的内部try/finally开始之前执行。

如果MailAddress 构造函数(或其参数表达式,或对From 的赋值,如果它是属性访问器)抛出异常,MailMessage 将不会被释放。

改为:

using (var msg = new MailMessage()) 
{
    msg.From = new MailAddress(ConfigurationManager.AppSettings["EmailSender"], ConfigurationManager.AppSettings["EmailSenderName"]);
    ...
}

临时的<>g_initLocal0 变量是MailMessage 在分配给msg 之前的名称。

【讨论】:

  • 移动了块内“From”的创建,瞧!
  • 我以前遇到过这种情况,对象不同但情况相似。构造 MailMessage 后设置 MailAddress。
猜你喜欢
  • 2014-10-02
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
相关资源
最近更新 更多