今日の初めに、作業中のコードでコード分析を実行しているときにCA1063に遭遇しました。
2つの質問があります:
次のコードが、一部の要求に明らかに違反しているにもかかわらず、CA1063を引き起こさないのはなぜですか(たとえば、Disposeがオーバーライドされます)
封印されたDispose()やファイナライザーなどによって呼び出される仮想Dispose(bool)を持つための複雑なスキームを引き起こしたコードの実際の問題は何ですか?
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Foobar : IDisposable { public Foobar() { Console.Out.WriteLine("Constructor of Foobar"); } public virtual void Dispose() { Console.Out.WriteLine("Dispose of Foobar"); GC.SuppressFinalize(this); } ~Foobar() { Console.Out.WriteLine("Finalizer of Foobar"); } } class Derived : Foobar { public Derived() { Console.Out.WriteLine("Constructor of Derived"); } public override void Dispose() { Console.Out.WriteLine("Dispose of Derived"); GC.SuppressFinalize(this); base.Dispose(); } ~Derived() { Console.Out.WriteLine("Finalizer of Derived"); } } class Program { static void Main() { Console.Out.WriteLine("Start"); using (var foo = new Derived()) { Console.Out.WriteLine("..."); } Console.Out.WriteLine("End"); } } }