如果我编写以下代码:
public void Execute()
{
var stream = new MemoryStream();
...
}
然后代码分析会将其标记为:
警告 1 CA2000:Microsoft.Reliability:在方法“ServiceUser.Execute()”中,在对对象“流”的所有引用超出范围之前调用 System.IDisposable.Dispose。C:\Dev\VS.NET\DisposeTest\DisposeTest\ServiceUser.cs 14 DisposeTest
但是,如果我创建工厂模式,我仍然可能需要处理对象,但现在 FxCop/代码分析不会抱怨。相反,它抱怨的是工厂方法,而不是调用它的代码。 (我想我有一个确实抱怨工厂方法的例子,但我在这里发布的那个没有,所以我把它删掉了)
有没有办法(例如使用属性)将 IDisposable 对象的责任从工厂方法转移到调用者身上?
拿这个代码:
public class ServiceUser
{
public void Execute()
{
var stream = StreamFactory.GetStream();
Debug.WriteLine(stream.Length);
}
}
public static class StreamFactory
{
public static Stream GetStream()
{
return new MemoryStream();
}
}
在这种情况下,没有警告。我希望 FxCOP/CA 仍然抱怨我原来的方法。处理那个对象仍然是我的责任。
有什么办法可以告诉 FxCOP/CA?例如,我最近冒险研究了 ReSharper 提供的注释属性,以便告诉它的分析引擎信息,否则它无法理解。
所以我设想这样的事情:
public static class StreamFactory
{
[return: CallerResponsibility]
public static Stream GetStream()
{
return new MemoryStream();
}
}
或者这种设计方式有问题?