次のコードを書くと:
public void Execute()
{
var stream = new MemoryStream();
...
}
次に、コード分析はこれに次のフラグを立てます。
警告1CA2000:Microsoft.Reliability:メソッド'ServiceUser.Execute()'で、オブジェクト'stream'へのすべての参照がスコープ外になる前にSystem.IDisposable.Disposeを呼び出します。C:\ Dev \ VS.NET \ DisposeTest \ DisposeTest \ ServiceUser.cs 14 DisposeTest
ただし、ファクトリパターンを作成した場合でも、オブジェクトを破棄する必要がある場合がありますが、FxCop /CodeAnalysisは文句を言いません。むしろ、それを呼び出すコードではなく、ファクトリメソッドについて文句を言います。 (ファクトリメソッドについて不満を言った例があったと思いますが、ここに投稿したものはそうではないので、それを打ち消しました)
たとえば、属性を使用して、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();
}
}
それとも、この設計はかなり離れていますか?