2011-08-07 5 views
6

コード解析ルールCA2000がVS2010によって厳密に厳しく適用されているということを嘆いているので、たくさんの質問がありますが、私はそれを適用すべきケースに入り込んだようですが、そうではありません。なぜBitmapはCA2000のルールを引き起こしますが、Imageはしませんか?

次のコードを考えてみましょう:

Image srcImage = Image.FromFile(source); 
Bitmap newImage = new Bitmap(newWidth, newHeight); 

using (Graphics gr = Graphics.FromImage(newImage)) 
{ 
    gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight)); 
} 
newImage.Save(destination, ImageFormat.Jpeg); 

私はこの上のVisual Studio 2010でコード分析を実行する場合さて、それはおよそNEWIMAGEが配置されていない文句を言うだろう(簡単な修正、他の使用してブロックに入れて)しかし、それは約srcImage(私は決して呼び出していないDispose()メソッドもあります)については不平を言っていません。誰もがなぜコード分析がここで文句を言わないのか知っていますか?

答えて

0

まあ、それはあまりにも「srcImage文句を言う」、しかし私は「gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));」あなたはDrawImageメソッドにそれを渡しているので、それはそれについて文句を言わないことを推測なければならない、だから、あることを知っているのに十分にスマートではありませんどちらかメソッドが返された後でさらに多くのアクションに使用されることはありません。または、それが廃棄されるインスタンスgrでそれを使用したと仮定したかもしれません。とにかくnewImageと同じようにsrcImageusingを使用し、そのコード解析に従わないでください。

+0

私は最初はそうだと思っていましたが、それらのすべては、そのような引数を別の関数に渡すことによってトリガーされるルールを持っています(通常はコンストラクタが関わっていますが)。この迷惑なルール(多くの人にとって、SOの質問の数で判断する)がこのような状況ではとても寛大であるということは奇妙です。 –

+0

うん、私はそれが迷惑であることに同意しますが、コードの問題を修正するためにコード分析に頼るのではなく、ここで何かを忘れてしまったかどうかを確認するために、 –

+0

ええと...しかし、その種のツールの目的を破る。私がそれらを使う理由は、私が間違ったことをした場所を指摘して、このような小さなことのために巨大なコードベースの狩りをする手間を省くためです。 –

5

CA2000と同様の/関連するCA2213(DisposableFieldsShouldBeDisposed)とCA1001(TypesThatOwnDisposableFieldsShouldBeDisposable)ルールは、ディスポーザブルの「所有権」をどのように認識するかについてかなり厳密です。インスタンスのコンストラクタを使用してコード内にインスタンスを直接作成する場合、コードは使い捨てインスタンスの所有者であるとみなします。 Image.FromFileを使用してsrcImageのインスタンスを作成するため、ルールはコードを所有者として認識しません。

このルールの動作に同意しない場合は、https://connect.microsoft.com/visualstudio/feedbackにバグレポートを作成することをお勧めします。 (あなたが使い捨てのフィールドルールを気にしているなら、あなたがそれをしている間に既存のhttps://connect.microsoft.com/VisualStudio/feedback/details/485291/typesthatowndisposablefieldsshouldbedisposable-rule-ca1001-is-too-permissive提案に投票したいかもしれません。)

+0

このようなルールの変更は、私が戻ったり、IDisposableの所有権を引き継ぎ、放棄したり、ファッジしたりすることを示す属性を持つ多くのメソッドにタグを付けることなく、本当に便利になりました(つまり、ツールは追跡されるべきではない)そのような振る舞いを導入することは価値があるかもしれませんが、きれいなレポートを得るために十分なタグを追加することは多くの作業になります。 – supercat

+0

@supercat:呼び出されたメソッドが、独自の状態でそのインスタンスを格納せずにディスポーザブルの新しいインスタンスを作成するファクトリメソッドであることを検出するようにルールを作成することは、かなり実現可能です。つまり、メタデータを追加せずにIoCのような複雑な作成パターンを処理することはできません。ただし、どの属性もコンシューマではなく、ファクトリメソッドを使用する必要があります。 –

+0

スキャナがファクトリのコードを参照できる場合、新しいIDisposableインスタンスを作成して返すと判断される可能性があります。しかし、すべての工場がスキャナにアクセス可能なコードを持っているわけではありません。工場の認識を追加すると、IDisposableオブジェクトが正当に引き渡されたときを認識することができない限り、スキャナはより有用な警告を生成しますが、偽のものも生成します。しかし、そのような認識は多くのトリッキーな問題を引き起こすでしょう.... – supercat

関連する問題