[英]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;
}
}
}
提前致谢
DirectoryEntry
和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
}
}
注意:发出警告的可能原因是,在lastName
if-condition或finally
块内, DirectorySearcher
实例没有Dispose()
方法,因此,当DirectoryEntry
对象已处置时,该对象保留在内存中。
参考文献:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.