_timer
変数に割り当てた後、変数にアクセスしていないため、警告が表示されます。
変数が静的であるかどうかによってエラーが異なる理由は、静的変数の性質によるものです。静的変数は型の一部であり、特定のオブジェクトの一部ではありません。その存続期間は、特定のオブジェクトではなく、アプリケーションドメインの存続期間に関連付けられています。その存続期間はアプリケーションドメインの存続期間に関連付けられているため、アプリケーションドメインの所有者がタイマーのクリーンアップを担当します。アプリケーションドメインの所有者はCLR自体であるため、CLRは静的タイマーをクリーンアップします。Dispose
静的分析では、アプリドメインがアンロードされている間にタイマーのファイナライザーが呼び出されるため、呼び出さないと文句を言うことはありません。
タイマーがインスタンスフィールドの場合、その存続期間は、タイマーを所有するオブジェクトの存続期間に関連付けられます。その場合、タイマーのクリーンアップは所有するオブジェクトの責任になります。C#では、このようなオブジェクトメンバーのクリーンアップは、Disposalパターンを使用して実行されます。(実装によって)そのパターンを実装していない場合、IDisposable
VS静的分析は警告を発行します。
そうは言っても、タイマーはの特殊なケースですIDisposable
。(コールバックでコードを実行することによって)タイマーを「使用」している場合でも、タイマーオブジェクト自体にアクセスしていないため、これらは特別です。したがって、Timer
クラスをサービスと考えたくなるかもしれません。つまり、Timer
コンストラクターはRegisterForPeriodicCallbacks
メソッドに似ていると思うかもしれません。それは間違いです。 Timer
はオブジェクトであり、C#ではそのように扱う必要があります。あなたはTimer
生涯を持つオブジェクト、そして他のオブジェクトによって決定されるオブジェクトとして考えなければなりません。
タイマーの有効期間をアプリケーションの有効期間に関連付けたい場合は、System.Timers.Timer
ではなくタイプの静的変数を作成する必要がありますSystem.Threading.Timer
。タイマーのティックを開始する場合は、そのStart
メソッドを呼び出すだけです。
タイマーの有効期間を他のオブジェクトの有効期間に関連付けたい場合は、タイマーを他のコンテナーオブジェクトのフィールドとして格納し、コンテナーオブジェクトにDisposalパターンを正しく実装する必要があります。
これらのいずれかを実行すると、静的分析の警告はすべて消えます。