2

次のコード分析エラーが発生します:CA1823:AvoidUnusedPrivateFields、次のコード行:

private static Timer _timer;

私のクラスのコンストラクターには、次のものがあります。

_timer = new Timer(OnTimerElapsed, _autoResetEvent, 1000, 1000);

タイマーでメソッドを呼び出す必要はありません。単にインスタンス化するだけで十分です。CAの警告が表示されるのはそのためですか?これは本当にエラーを抑制する必要がある場合ですか、それとも何かが足りないのですか?

ちなみに、タイマーでDispose()を呼び出す必要があるというエラーは発生していません。そのエラーが発生するべきではありませんか?

- 編集 -

_timerをインスタンスフィールドにすると、Dispose()を呼び出さないというエラーが発生します。そのために静的とインスタンスが重要なのはなぜですか?

4

3 に答える 3

4

フィールドを初期化するだけでは、それを使用することは考慮されません。あなたは実際にそれを使う必要があります:)

「編集」に関しては、静的オブジェクトを破棄しないでください。破棄しないと、将来アクセスしようとして問題が発生します。それがあなたが述べたように警告が機能した理由です。

于 2012-07-25T20:32:19.820 に答える
4

_timer変数に割り当てた後、変数にアクセスしていないため、警告が表示されます。

変数が静的であるかどうかによってエラーが異なる理由は、静的変数の性質によるものです。静的変数はの一部であり、特定のオブジェクトの一部ではありません。その存続期間は、特定のオブジェクトではなく、アプリケーションドメインの存続​​期間に関連付けられています。その存続期間はアプリケーションドメインの存続​​期間に関連付けられているため、アプリケーションドメインの所有者がタイマーのクリーンアップを担当します。アプリケーションドメインの所有者はCLR自体であるため、CLRは静的タイマーをクリーンアップします。Dispose静的分析では、アプリドメインがアンロードされている間にタイマーのファイナライザーが呼び出されるため、呼び出さないと文句を言うことはありません。

タイマーがインスタンスフィールドの場合、その存続期間は、タイマーを所有するオブジェクトの存続期間に関連付けられます。その場合、タイマーのクリーンアップは所有するオブジェクトの責任になります。C#では、このようなオブジェクトメンバーのクリーンアップは、Disposalパターンを使用して実行されます。(実装によって)そのパターンを実装していない場合、IDisposableVS静的分析は警告を発行します。

そうは言っても、タイマーはの特殊なケースですIDisposable。(コールバックでコードを実行することによって)タイマーを「使用」している場合でも、タイマーオブジェクト自体にアクセスしていないため、これらは特別です。したがって、Timerクラスをサービスと考えたくなるかもしれません。つまり、TimerコンストラクターはRegisterForPeriodicCallbacksメソッドに似ていると思うかもしれません。それは間違いです。 Timerはオブジェクトであり、C#ではそのように扱う必要があります。あなたはTimer生涯を持つオブジェクト、そして他のオブジェクトによって決定されるオブジェクトとして考えなければなりません。

タイマーの有効期間をアプリケーションの有効期間に関連付けたい場合は、System.Timers.Timerではなくタイプの静的変数を作成する必要がありますSystem.Threading.Timer。タイマーのティックを開始する場合は、そのStartメソッドを呼び出すだけです。

タイマーの有効期間を他のオブジェクトの有効期間に関連付けたい場合は、タイマーを他のコンテナーオブジェクトのフィールドとして格納し、コンテナーオブジェクトにDisposalパターンを正しく実装する必要があります。

これらのいずれかを実行すると、静的分析の警告はすべて消えます。

于 2012-07-25T21:10:26.370 に答える
0

System.Windows.Forms.Timerを使用していると仮定すると、この警告が発生する別の問題があると思います。この警告を無視するか、_timer変数を削除しても安全です。ただし、アプリケーションが終了している間、タイマーは引き続き実行されます。あなたはおそらくそれを望まないでしょう。タイマーを無効にし、終了時に破棄する可能性があるため、この変数を使用することをお勧めします。

于 2012-07-25T20:42:56.853 に答える