2011-02-23 88 views
5

Điều này có chứa rò rỉ bộ nhớ không? Tôi đã cố gắng để hiểu rõ hơn về rò rỉ bộ nhớ, nhưng tôi không thể biết liệu tôi đã sửa lỗi này chưa? Nếu không, làm cách nào để xử lý chính xác đối tượng SPweb và đối tượng SPSite?Rò rỉ bộ nhớ SharePoint

using (SPWeb oWebsite = new SPSite(webUrl).OpenWeb()) //Open SP Web 
{ 
    SPListCollection collList = oWebsite.Lists; //Open Lists 

    foreach (SPList oList in collList) 
    //For Each List Execute this 
    { 
     if (!oList.Hidden) 
     //If the list is hidden do this else nothing 
     { 
      ListSitesDropDownBox.Items.Add(new ListItem(SPEncode.HtmlEncode(oList.Title), SPEncode.HtmlEncode(oList.Title))); 
      ViewState["Item" + counter] = SPEncode.HtmlEncode(oList.Title); 
      counter++; 
     } 
    } 
} 

Trả lời

13

Đúng vậy. Bạn vứt bỏ SPWeb nhưng quên xử lý SPSite.
Cách đúng để làm điều này:

using (var site = new SPSite(webUrl)) 
using (var web = site.OpenWeb()) { 
    // ... 
} 

Lưu ý rằng đây là tương đương với:

using (var site = new SPSite(webUrl)) { 
    using (var web = site.OpenWeb()) { 
     // ... 
    } 
} 

nhưng tôi bỏ qua niềng răng cho bên ngoài using để giảm mã làm tổ. Các quy tắc giằng giống như đối với if.

Một vài nhận xét về phong cách:

  • Xin vui lòng, don't use Systems Hungarian in C# code. Chỉ list.
  • Nhận xét rằng cụm từ mã ở trên không có ý nghĩa gì. Giữ chúng mang tính xây dựng, tức là giải thích mục đích của mã. một cái gì đó thay vì bốn ý kiến, bạn nên đã viết như thế trong đầu:

    // Populate drop-down list with list names and save them in ViewState 
    
+2

+1. Đây là bài viết bạn cần đọc nếu bạn làm việc với các đối tượng SPxxx - http://msdn.microsoft.com/en-us/library/aa973248.aspx –

+0

bạn đang đề cập đến điều gì khi bạn chỉ nói Danh sách? – atrljoe

+0

Bạn sử dụng ký pháp Hungary cho các biến đặt tên, tức là tiền tố tên biến của bạn với chữ viết tắt tên loại. Tôi hiểu 'o' là viết tắt của' đối tượng'. Tuy nhiên điều này là hoàn toàn không cần thiết trong C# bởi vì nó có hệ thống kiểu mạnh và VS là một IDE mạnh mẽ với các tính năng như IntelliSense. Tôi khuyên bạn nên sử dụng 'website' thay vì' oWebsite', 'list' thay vì' oList', 'lists' (hoặc' allLists') thay vì 'collList' et cetera vụng về. –

2

Bạn chưa xử lý đối tượng SPSite trong việc sử dụng, chỉ SPWeb của bạn.

0

Những người khác đã trả lời câu hỏi của bạn, nhưng tôi sẽ thêm rằng bạn nên chạy xây dựng của bạn thông qua SPDisposeCheck: http://archive.msdn.microsoft.com/SPDisposeCheck
Nó không phải là hoàn hảo nhưng nó sẽ đấm bạn tắt sớm để rất nhiều vấn đề.