使用Resharper识别IDisposable的实例

时间:2013-07-12 22:35:03

标签: c# .net resharper

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

1 个答案:

答案 0 :(得分:16)

仅靠ReSharper无法做到这一点。

不幸的是,FXCop也不能这样做。 FXCop可以警告包含实现IDisposable的类型字段的类型,但包含它们的类型不实现IDisposable。这不是这里要求的。

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

enable code analysis

具体来说,您要启用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在对所有引用超出范围之前对象'stream'。

注意:在某些情况下,这会产生误报和误报。首先,该规则检测到并且没有警告您返回这样的对象这一事实。

但是,在你找回对象的方法中,它只会引出你在某些情况下不处理它的事实。

具体来说,这将创建警告:

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();
}

规则似乎检测到创建是工厂方法的前缀,因此调用者会处理该对象,而获取则不是这样的前缀,所以它落在被调用处理它的方法上,但由于它返回了对象,它也没有那个责任。