SharePoint内存泄漏

5

这段代码是否存在内存泄漏问题?我一直在尝试更好地理解内存泄漏,但我无法确定我是否已经解决了这个问题。如果没有,我该如何正确地处理 SPweb 对象和 SPSite 对象?

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++;
        }
    }
}
3个回答

14

没错,确实如此。你释放了 SPWeb 但忘记释放 SPSite
正确的做法是:

using (var site = new SPSite(webUrl))
using (var web = site.OpenWeb()) {
    // ...
}
请提供需要翻译的完整上下文,以便我可以更准确地进行翻译。
using (var site = new SPSite(webUrl)) {
    using (var web = site.OpenWeb()) {
        // ...
    }
}

我省略了外层using的大括号以减少代码嵌套。外层大括号的规则与if相同。

一些风格上的提示:

  • 请不要在C#代码中使用系统匈牙利命名法,只需使用list即可。(参考链接)
  • 重述代码的注释毫无意义。保持建设性,即解释代码的目的。代替那四个注释,你应该在开头写一些类似这样的内容:

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

2
+1. 如果您正在处理 SPxxx 对象,这是您需要阅读的文章 - http://msdn.microsoft.com/en-us/library/aa973248.aspx - Alexei Levenkov
当你说“List”时,你指的是什么? - atrljoe
您在变量命名中使用匈牙利命名法,即在变量名前缀中加入类型名称的缩写。我理解 o 代表着 object。然而,在 C# 中这是完全不必要的,因为它具有强大的类型系统,而且 VS 是一个拥有 IntelliSense 等功能的强大 IDE。我建议您使用 website 替代 oWebsite,使用 list 替代 oList,使用 lists(或 allLists)替代笨拙的 collList 等等。 - Dan Abramov
@atrljoe 请阅读一下这个链接:http://en.wikipedia.org/wiki/Hungarian_notation - 虽然现在已经不需要了,但我仍然习惯使用匈牙利命名法撰写代码。新手编程者也许会从使用它的大量代码示例中学习到,认为这是正常的做法,实际上,在C#中这是相当古老的一种做法。 - James Love
1
+1 这是一个很棒的回答。我喜欢你涉及了a)问题的回答,b)展示了一些有用的语法糖“using”,以及c)谈论编码风格。所有这些都在15行左右的文本中完成了!;-) - Pandincus

2

您在 using 语句中没有释放 SPSite 对象,只释放了 SPWeb 对象。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接