c# - 代码分析提示我没有处理对象。这里有什么问题?

标签 c# dispose code-analysis mailmessage

考虑这段代码

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(new MemoryStream(attachment.Data), attachment.Name));

我不知道如何正确处理它。我尝试了不同的方法,但在发送“流已关闭”的邮件时出现异常

最佳答案

基本上你不应该 - 稍后处理邮件消息将处理每个附件,这将处理每个流。此外,未能处理未在远程处理中使用的 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();
        }
    }
}

但就我个人而言,我会说这是矫枉过正。

关于c# - 代码分析提示我没有处理对象。这里有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7125249/

相关文章:

c# - MVC4 WebApi Controller 使用 Dispose 模式发布操作导致多个操作发现异常

java - 处置容器是否会删除所有已注册的监听器?

java - 记录或重新抛出此异常

c# - MAF 对比 MEF 对比 Prism

c# - 使用单个模型属性将多个数组值传递给 Web API Controller

当框架不可见时,Java 不处理对话框

asp.net - 用于检查跨站点脚本的 ASP .NET 代码分析工具

code-analysis - 是否有任何工具可以确定对 Big-O 复杂性执行代码分析?

c# - 如何打开/关闭代码模块?

c# - 用于高效插入/查询任意属性的良好数据结构