私はこの警告を抑制せずに対処しようとしています。それを個人的な挑戦と呼んでください。それへのすべての参照がスコープ外になる前にCA2000の仕組みとその回避策
方法でCA2000「
CreateAndUse
は」、「新しいプロジェクト()」オブジェクトにSystem.IDisposable.Disposeを呼び出します。
IDisposable
とすると、任意のProject
クラスのインターフェイス。
public static TR Using<T, TR>(this T instance, Func<T, TR> expression)
where T : IDisposable
{
using (instance)
return expression(instance);
}
確かにスマートコンパイラはこれを正しく分析することができる必要があります:拡張メソッドを考える
public void CreateAndUse()
{
var instances = new Project().Using(_ => _.LoadItems());
}
? CA2000が発生
私は何かが足りないと思う...
あなたの拡張メソッドが 'using'ステートメントを使ってあなたに与える価値は?それはほんの数文字未満のコードですか?他の開発者がインダイレクションの層に感謝すると思いますか?コードを読みやすく理解していますか?これはナンセンスです。 – jgauffin
'CA2000'はコンパイラエラーではなく、コード解析エラーです。コード分析は、コードが正しいことを確実に実行していることを証明するために網羅的なフロー分析を実行するように設計されておらず、ここでやっている問題のあるコードパターンを検出するためにかなり簡単な分析を行うように設計されています。 「使い捨てオブジェクトは範囲外になる前に処分されるべきです」は、「この特定のプログラムで実行可能なすべてのパスが確実に '.Dispose()'が呼び出されることを確認する」よりも実装が少し簡単です。一般に。 –
最後のコメントには実際に答えがあります。 QUESTIONは、「スマートなコンパイラがこれを正確に分析できるはずですか? CA2000は全くコンパイラと無関係です。 – TomTom