CA2000在DirectoryEntry对象的MVC项目中丢失范围之前处理对象

时间:2017-09-07 07:34:17

标签: c# asp.net-mvc

CA 2000在ASP.NET模型视图控制器项目中的目录条目对象的代码分析中显示丢失范围错误之前处理对象。

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

            }
        }

提前致谢

1 个答案:

答案 0 :(得分:0)

DirectoryEntry&amp; DirectorySearcher实现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
    }
}

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

参考文献:

CA2000: Dispose objects before losing scope

Using statement with directoryservices