Анализ кода жалуется, что я не избавляюсь от объектов. Что здесь не так? - PullRequest
5 голосов
/ 19 августа 2011

Считайте этот код

private MailMessage GetMailMessageFromMailItem(Data.SystemX.MailItem mailItem)
        {

            var msg = new MailMessage();

            foreach (var recipient in mailItem.MailRecipients)
            {
                var recipientX = Membership.GetUser(recipient.UserKey);
                if (recipientX == null)
                {
                    continue;
                }

                msg.To.Add(new MailAddress(recipientX.Email, recipientX.UserName));
            }

            msg.From = new MailAddress(ConfigurationManager.AppSettings["EmailSender"],
                                   ConfigurationManager.AppSettings["EmailSenderName"]);

            msg.Subject = sender.UserName;
            if (!string.IsNullOrEmpty(alias)) msg.Subject += "(" + alias + ")";
            msg.Subject += " " + mailItem.Subject;
            msg.Body = mailItem.Body;
            msg.Body += Environment.NewLine + Environment.NewLine + "To reply via Web click link below:" + Environment.NewLine;
            msg.Body += ConfigurationManager.AppSettings["MailPagePath"] + "?AID=" + ContextManager.AccountId + "&RUN=" + sender.UserName;

            if (mailItem.MailAttachments != null)
            {
                foreach (var attachment in mailItem.MailAttachments)
                {
                    msg.Attachments.Add(new Attachment(new MemoryStream(attachment.Data), attachment.Name));
                }
            }

            return msg;
        }

Я просто беру свой тип базы данных и преобразую в MailMessage. Это отправлено в другой функции.

Анализ кода говорит мне, что я не использую "msg", что является правильным. Но если я делаю это здесь - я получаю исключение, когда пытаюсь отправить это.

Кроме того, он жалуется на то, что не удаляет MemoryStream здесь:

msg.Attachments.Add (new Attachment (новый MemoryStream (attachment.Data), attachment.Name));

Понятия не имею, как правильно его распорядиться. Я пробовал разные вещи, но получал исключения при отправке почты с сообщением "Поток закрывается"

Ответы [ 3 ]

2 голосов
/ 19 августа 2011

Как правило, вы не должны - удаление почтового сообщения позже будет распоряжаться каждым вложением, которое будет распоряжаться каждым потоком. Кроме того, неспособность избавиться от MemoryStream, который не используется в удаленном взаимодействии, не принесет никакого вреда.

Я предлагаю вам отключить предупреждение для этого метода.

РЕДАКТИРОВАТЬ: Я подозреваю, что вы можете использовать [SuppressMessage] для подавления сообщения.


Обратите внимание, что существует риск того, что какой-то код перебросит код на полпути через метод, поэтому в итоге вы никогда не сможете избавиться от сообщения, даже если в вызывающем коде есть оператор using. Если вы действительно обеспокоены, вы можете написать:

private MailMessage GetMailMessageFromMailItem(Data.SystemX.MailItem mailItem)
{
    bool success = false;
    var msg = new MailMessage();
    try
    {
        // Code to build up bits of the message
        success = true;
        return msg;
    }
    finally
    {
        if (!success)
        {
            msg.Dispose();
        }
    }
}

Лично я бы сказал, что это излишне.

0 голосов
/ 19 августа 2011

Создатель одноразового предмета должен также утилизировать его.Если вы не можете удалить сообщение здесь, тогда оно должно быть передано от создателя где-то еще.Анализ кода в этом случае является правильным, и вы можете получить очень неудачные и трудные для устранения утечки, если игнорируете эти сообщения.

0 голосов
/ 19 августа 2011

Что касается "не утилизировать" msg "", я могу думать только о том, чтобы вместо возврата MailMessage передать ссылку на MailMessage.Что-то вроде этого.Не уверен, что это хорошая идея.

private void GetMailMessageFromMailItem(ref MailMessage msg, Data.SystemX.MailItem mailItem)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...