我有以下设置:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
我使用int.MaxValue的原因是因为在这种情况下我知道我会超过默认值,但数字永远不会太大,所以我对这一点很好.
但是,如果我打开代码分析和Microsoft基本正确性规则,它会抱怨:
警告2 CA2000:Microsoft.Reliability:在方法'SomeClass.SomeClass()'中,对象'<> g_ initLocal0'未沿所有异常路径放置.在对对象'<> g _initLocal0'的所有引用都超出范围之前,调用System.IDisposable.Dispose.
问题是PageSize和SizeLimit可以抛出异常,如果发生这种情况,G__initLocal0对象就不会被处理掉(即使_searcher它被处理掉了).他们可以抛出的例外情况是,如果你将它们分配给负数,这在这里不会发生,但它仍然会抱怨.
接下来,我使用常规赋值语句在对象intitializer外部设置属性,但是然后ReSharper抱怨告诉我应该使用Initializer.我可以压制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 = …Run Code Online (Sandbox Code Playgroud) c# ×1