在实例化实现IDisposable的对象(即SqlConnection,StreamReader)时,Resharper(v 7.1.3)能否帮助识别不应用“using”关键字的代码?
答案 0 :(得分:16)
仅靠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在对所有引用超出范围之前对象'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();
}
规则似乎检测到创建是工厂方法的前缀,因此调用者会处理该对象,而获取则不是这样的前缀,所以它落在被调用处理它的方法上,但由于它返回了对象,它也没有那个责任。