Resharper (v 7.1.3)能否帮助识别在实例化实现 IDisposable 的对象(即 SqlConnection、StreamReader)时不应用“using”关键字的代码?
1 回答
仅 ReSharper 无法做到这一点。
不幸的是,FXCop 也无法做到这一点。FXCop 可以对包含实现 IDisposable 的类型字段的类型发出警告,但包含它们的类型不实现 IDisposable。这不是这里所要求的。
您需要的是 Visual Studio 2012,然后启用代码分析引擎在您的代码上发挥其魔力。确保启用包含规则的规则集。
具体来说,您要启用 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不是这样的前缀,因此它依赖于被调用的方法来处理它,但是由于它返回对象,它也没有那个责任。