2011-08-19 29 views
5

xem xét mã nàyPhân tích mã phàn nàn tôi không vứt bỏ đồ vật. Có gì sai ở đây?

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; 
     } 

Tôi chỉ dùng loại cơ sở dữ liệu của tôi và chuyển sang MailMessage. Nó nhận được gửi trong một chức năng khác.

Phân tích mã cho tôi biết tôi không xử lý "msg" đúng. Nhưng nếu tôi làm điều đó ở đây - tôi có ngoại lệ khi tôi đang cố gửi nó.

Ngoài ra, nó than phiền về việc không xử lý MemoryStream đây:

msg.Attachments.Add (Đính kèm mới (MemoryStream mới (attachment.Data), attachment.Name));

Tôi không biết cách xử lý đúng cách. Tôi đã thử những thứ khác nhau nhưng đã nhận được ngoại lệ khi gửi thư cho biết "Luồng đang đóng"

Trả lời

2

Về cơ bản bạn không nên - xử lý thư sau sau sẽ hủy bỏ từng tệp đính kèm. Bên cạnh đó, không vứt bỏ một MemoryStream mà không được sử dụng trong điều khiển từ xa sẽ không gây hại gì.

Tôi khuyên bạn nên tắt cảnh báo cho phương pháp này.

EDIT: Tôi nghi ngờ bạn có thể sử dụng [SuppressMessage] để chặn thông báo.


Lưu ý rằng có một nguy cơ là một số mã sẽ ném đang nửa đường thông qua phương pháp này, vì vậy bạn không bao giờ kết thúc có khả năng xử lý của thông điệp thậm chí nếu bạn có một tuyên bố using trong mã gọi. Nếu bạn thực sự lo lắng, bạn có thể viết:

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á nhân tôi muốn nói điều này là quá mức cần thiết.

+0

Làm cách nào để ngăn chặn cảnh báo? – katit

+0

@katit: Vượt qua - Tôi không sử dụng phân tích mã. Tôi chắc chắn có rất nhiều hướng dẫn trực tuyến mặc dù. –

+0

@Downvoter: Chăm sóc bình luận? –

0

Liên quan đến "không xử lý" msg "", cách duy nhất tôi có thể nghĩ là thay vì trả lại MailMessage thay vì chuyển qua tham chiếu đến MailMessage. Một cái gì đó như thế này. Không chắc đó có phải là một ý hay hay không.

private void GetMailMessageFromMailItem(ref MailMessage msg, Data.SystemX.MailItem mailItem) 
+0

Tôi nghi ngờ rằng luồng sẽ được lưu trữ trong phần đính kèm và chỉ đọc sau. –

+0

@Jon Skeet, bây giờ tôi nghĩ về nó, luồng sẽ cần phải mở. – Jethro

-1

Tác giả của đối tượng dùng một lần cũng nên vứt bỏ nó. Nếu bạn không thể vứt bỏ thư ở đây thì thư sẽ được chuyển vào từ người sáng tạo ở nơi khác. Mã phân tích là đúng trong trường hợp này và bạn có thể kết thúc với rất không may và khó khăn để gỡ lỗi rò rỉ nếu bạn bỏ qua những tin nhắn này.

+0

Chuyển quyền sở hữu là một khái niệm rất hữu ích, rất tiếc là cả C# lẫn Phân tích Mã đều không hỗ trợ. –

+0

Vì vậy, nó là để tránh. Vì vậy, nó là khôn ngoan để gán trách nhiệm sáng tạo cho xử lý các nguồn lực dùng một lần của nó. –

+0

Tác giả không phải lúc nào cũng là chủ sở hữu hợp lý. Ví dụ, trong mô hình nhà máy, người sáng tạo không bao giờ là chủ sở hữu, cũng như nhà máy có thể vứt bỏ tài nguyên mà nó tạo ra. Thay vào đó, một tài nguyên không được khai báo phải được trả về. –

Các vấn đề liên quan