Проверка кода говорит, что мне нужно избавиться от объекта.Который из? - PullRequest
17 голосов
/ 25 июня 2011

Это моя функция.Я уже включил и клиент, и сообщение в предложение 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

1 Ответ

18 голосов
/ 25 июня 2011

Ваша проблема в этой строке:

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

Блок инициализатора { From = ... } выполняется после создания объекта и до начала внутреннего try/finally блока using.

Если конструктор MailAddress (или его аргументные выражения, или присвоение From, если это средство доступа к свойству) генерирует исключение, MailMessage не будет удален.

Измените на:

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

Временная переменная <>g_initLocal0 - это имя MailMessage до того, как оно будет присвоено msg.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...