2

Legecyシステムからいくつかのコードを読み取ります。

クラスAのインスタンスがあり、それをコレクションに追加してから破棄するとします。

コードはまだmyControlCollcetionを使用しているため、ここで暗黙的な破棄を使用するポイントが何であるかを理解できません。つまり、cltCheckBoxAは実際には解放されません。

なんで?

using (UserControlA cltCheckBoxA = new UserControlA())
{
    //some operation
    base.myControlCollcetion.Add(cltCheckBoxA);
}

//Other operation against myControlCollcetion
4

2 に答える 2

4

オブジェクトを破棄することは、その管理対象メモリを解放することとはまったく異なります(これは、GCが行うことです)。Disposeは、ガベージコレクターが解放できないすべての管理されていないリソースを明示的にクリーンアップしています。

これは、オブジェクトがDispose呼び出された後に使用される場合、多くの可能性があることを意味します。(これは完全なリストではありません。)

  1. 管理されていないリソースがクリーンアップされると、多くのオブジェクトは本質的に使用できなくなります。この場合、メンバーの1つにアクセスするたびに、例外をスローするのが一般的です。
  2. オブジェクトは、廃棄後に使用されているため、予期しないマナーで動作する可能性があります。奇妙な例外が発生したり、メソッドからの結果が正しくなかったりする可能性があります。
  3. 実際に管理されていないリソースがあったことは一度もないかもしれません。一部のオブジェクトは、拡張性を高めるため、または将来にわたって利用できるようにするためにIDisposableを実装しています。 DataTableこの例です。何もしDisposeません。この場合、オブジェクトは破棄された後は問題なく機能します。
  4. 管理されていないリソースがなくても、オブジェクトを引き続き使用できる可能性があります。呼び出された後、その機能の一部だけが使用できなくなる可能性がありますDispose。その場合、後でそれらの限定された側面のみが使用される限り、問題なく機能します。
  5. 一部のオブジェクトは、破棄後にアクセスされたときに、管理されていないリソースを再作成する場合があります。それは悪い習慣ですが、あなたがやりたいことができるのはあなたのクラスです。
于 2012-08-15T16:08:26.870 に答える
2

そうです、これを行う理由はありません。たとえあったとしても、これは悪いコードであり、非常に混乱します。

開発者は(何らかの理由で。たとえば、でマークされたコードセクションで、管理されていないリソースを割り当てた関数を実行する可能性があります)を明示的Dispose(..)に呼び出し、シーケンスの追加を回避しようとしました(自動的に処理します)。UserControlA//some operationtry/catchusing

しかし、繰り返しますが、これは良いコードではありません。

于 2012-08-15T16:03:42.300 に答える