我有以下设置:
public class SomeClass
{
private DirectoryEntry _root;
private DirectorySearcher _searcher;
public SomeClass()
{
_root = new DirectoryEntry("ldap://bla");
_searcher = new DirectorySearcher(_root)
{
PageSize = int.MaxValue,
SizeLimit = int.MaxValue
}
}
}
我使用 int.MaxValue 的原因是因为在这种情况下我知道我会超过默认值,但这个数字永远不会大得离谱,所以我对此很满意。
但如果我打开代码分析 and Microsoft 基本正确性规则它抱怨:
警告 2 CA2000:Microsoft.Reliability:在方法“SomeClass.SomeClass()”中,对象“g_”initLocal0' 并未沿着所有异常路径进行处理。对对象 'g 调用 System.IDisposable.Dispose_initLocal0' 在所有对它的引用超出范围之前。
问题是 PageSize 和 SizeLimit 可能会抛出异常,如果发生这种情况G__initLocal0
对象不会被处置(即使_searcher
确实被处置了)。他们可以抛出的异常是,如果您将它们分配给负数,这在这里不会发生,但它仍然会抱怨。
接下来,我使用常规赋值语句在对象初始化程序外部设置属性,但随后 ReSharper 抱怨告诉我应该使用初始化程序。我可以抑制 ReSharper,但我喜欢找到一种在不添加抑制的情况下让事情正常工作的方法。
所以我想我必须捕获错误,并且如果可能的话,我不喜欢在构造函数中捕获错误,所以我创建了一个名为 Searcher 的属性,如下所示:
private DirectorySearcher _searcher;
public DirectorySearcher Searcher
{
get
{
if (_searcher != null) return _searcher;
var searcher = new DirectorySearcher();
try
{
searcher.PageSize = int.MaxValue;
searcher.SizeLimit = int.MaxValue;
_searcher = searcher;
}
catch
{
searcher.PageSize = 1000;
searcher.SizeLimit = 1000;
}
finally
{
searcher.Dispose();
}
return _searcher;
}
}
现在代码分析一切都很顺利,但我对解决方案根本不满意。
有什么提示吗?