繁体   English   中英

CA2000在失去DirectoryEntry对象的MVC项目中的作用域之前,先处理对象

[英]CA2000 Dispose objects before losing scope in MVC project for DirectoryEntry object

CA 2000在ASP.NET-Model View Controller项目的“目录分析”的“代码分析”中显示的丢失范围错误之前,请先处理对象。

Manager类中使用的Directory Entry对象,并且我在finally语句中配置了Directory Entry对象。 但是代码分析仍然显示错误。

请找到代码段,并建议我们解决该问题。

public static IList<User> GetADUserDetails(string lastName)
        {
            DirectoryEntry searchRoot = null;
            DirectorySearcher search = null;
            SearchResultCollection resultCollection = null;
            SearchResult result;
            List<User> listADUsers = new List<User>();
            User listUsers = null;
            try
            {
                if (!string.IsNullOrEmpty(lastName))
                {
                    searchRoot = new DirectoryEntry();
                    searchRoot = ConnectLdapActiveDirectory();
                    search = new DirectorySearcher(searchRoot);

            // do something                
        }
            }
            catch
            {
                throw;
            }
            finally
            {
                if (searchRoot != null)
                {
                    searchRoot.Dispose();
                    searchRoot = null;
                }

            }
        }

提前致谢

DirectoryEntryDirectorySearcher实现了IDisposable接口,因此,最好在块结束后与它们一起使用using语句来自动处理。 这是有关CA2000警告的简短说明(有关更多信息,请参见下面的参考):

如果在所有对它的引用超出范围之前未明确处理可弃对象,则当垃圾收集器运行该对象的终结器时,该对象将在不确定的时间被弃置。 因为可能发生异常事件,这将阻止对象的终结器运行,所以应改为显式处置该对象。

基于上述原因,应该对代码进行如下修改:

public static IList<User> GetADUserDetails(string lastName)
{
    SearchResultCollection resultCollection;
    SearchResult result;
    List<User> listADUsers = new List<User>();
    User listUsers = null;

    try
    {
        if (!string.IsNullOrEmpty(lastName))
        {
            // if `ConnectLdapActiveDirectory` method returns `DirectoryEntry`, you can use this assignment
            using (DirectoryEntry searchRoot = ConnectLdapActiveDirectory())
            {      
                using (DirectorySearcher search = new DirectorySearcher(searchRoot))
                {    
                    // do something                
                }
            }
        }
    }
    catch
    {
        throw;
    }
    finally
    {
        // do something
    }
}

注意:发出警告的可能原因是,在lastName if-condition或finally块内, DirectorySearcher实例没有Dispose()方法,因此,当DirectoryEntry对象已处置时,该对象保留在内存中。

参考文献:

CA2000:在失去作用域之前处理对象

在目录服务中使用语句

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM