5

Resharper (v 7.1.3)能否帮助识别在实例化实现 IDisposable 的对象(即 SqlConnection、StreamReader)时不应用“using”关键字的代码?

4

1 回答 1

17

仅 ReSharper 无法做到这一点。

不幸的是,FXCop 也无法做到这一点。FXCop 可以对包含实现 IDisposable 的类型字段的类型发出警告,但包含它们的类型不实现 IDisposable。这不是这里所要求的。

您需要的是 Visual Studio 2012,然后启用代码分析引擎在您的代码上发挥其魔力。确保启用包含规则的规则集。

启用代码分析

具体来说,您要启用 CA2000 警告:

CA2000

启用此功能后,编写如下代码:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var stream = new MemoryStream();
        }
    }
}

你得到这个:

d:\Dev\VS.NET\ConsoleApplication1\ConsoleApplication1\Program.cs(14):警告:CA2000:Microsoft.Reliability:在方法“Program.Main(string[])”中,对对象“调用 System.IDisposable.Dispose”在所有对它的引用都超出范围之前。

注意:这在某些情况下会同时产生假阴性和假阳性。首先,该规则检测并且不会警告您返回此类对象的事实。

但是,在您取回对象的方法中,它只会指出您在某些情况下不处置它的事实。

具体来说,这将产生警告:

static void Main(string[] args)
{
    var stream = CreateStream(); // warning here
}

private static MemoryStream CreateStream()
{
    return new MemoryStream();
}

而这不会:

static void Main(string[] args)
{
    var stream = GetStream(); // NO warning here
}

private static MemoryStream GetStream()
{
    return new MemoryStream();
}

该规则似乎检测到Create是工厂方法的前缀,因此它由调用者处理对象,而Get不是这样的前缀,因此它依赖于被调用的方法来处理它,但是由于它返回对象,它也没有那个责任。

于 2013-07-12T22:51:09.167 回答