小编car*_*3rg的帖子

对象初始值设定项和属性可以抛出异常时的Dispose

我有以下设置:

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#

4
推荐指数
2
解决办法
2870
查看次数

标签 统计

c# ×1