2

Compact Framework では、System.Windows.Forms.Timer クラスは system.componentmodel コンストラクターをサポートしていません。

新しい Timer() がサポートされています: http://msdn.microsoft.com/en-us/library/aa335543(v=vs.71).aspx

新しいタイマー (IContainer コンテナー) はサポートされていません: http://msdn.microsoft.com/en-us/library/aa335544(v=vs.71).aspx

これは、CF アプリのフォームにタイマーを追加しても、フォームの IContainer コンポーネント フィールドに追加されないため、フォームが dispose()d のときに auto-dispose()d を取得しないことを意味します。

これがサポートされていないのはなぜですか?

フォームが破棄されたときにタイマーを破棄するにはどうすればよいですか? 私には2つの主なオプションがあるようです:

  • フォームの dispose() メソッドを .designer.cs からメインの .cs ファイルに移動し、そこに手動の「_timer.dispose()」呼び出しを追加します
  • または、InitializeComponent() が呼び出された後、フォームの作成時に Timer オブジェクトをコンポーネント コレクションに手動で追加します。

どちらを優先する必要がありますか? これら 2 つのうちの 1 つを忘れると、Timer は永遠に存続し、フォームを存続させます (Timer は GC できず、フォームの Timer_Tick() メソッドへの参照を保持しているため、フォームは GC されません)。 )。

この実装の決定は、注意する必要がある CF マシンでのタイマーとディスポに関する奇妙さを反映していますか?

4

1 に答える 1

3

オプション3に投票します。フォームデザイナからタイマーを追加しないでください。代わりに、コードに手動で追加し、コンポーネントコレクションにも手動で追加します。

これについての私の推論は次のようになります:

  • デザイナーコードをいじくりまわすことは一般的に悪い考えなので、最初のオプションにはコードの臭いがあります
  • それをコンポーネントコレクションに手動で追加すると、将来の開発者(数か月以内に自分自身でさえ)がなぜそこにあるのか理解できず、悩む傾向があります。
  • 私は通常、オブジェクトの初期化を「混合」するのは好きではありません。設計者がオブジェクトの初期化を実行している場合、オブジェクトの一部だけではなく、すべてを実行するか、まったく実行しない必要があります。コードが維持されている場合、または誰かが他のクラスにコピーアンドペーストを行っている場合の再利用中に、部分的な作業を行うことは致命的です。
于 2011-02-22T14:22:31.973 に答える