2017-03-16 13 views
0

なぜwinform Disposeメソッドがで「冗長な電話を検出しましたか」なぜwinform Disposeメソッドが見つかりません '冗長呼び出しを検出する'?

protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

なぜ、この:

Winフォームは現在の方法を処分しますか?

private bool disposedValue = false; //To detect redundant calls 
    protected override void Dispose(bool disposing) 
    { 
     if (!disposedValue) 
     { 
      if (disposing && (components != null)) 
      { 
       components.Dispose(); 
      } 

      base.Dispose(disposing); 

      disposedValue = true; 
     } 
    } 
+1

私は、問題を表現していないため、トピック生成ツールとしてこの問題をクローズするよう投票していますが、明らかにツール生成コードの明確化を求めています。 –

+0

hvdが指摘しているように、Disposeは何度も呼び出すことができ、エラーとして扱われるべきではありませんが、実際にはそういったことはほとんどいつでも間違いの兆候であることが分かります。なぜ*エラー "パス? –

+0

@Damien_The_Unbelieverしかし、 '管理されていないオブジェクト'がある場合は、 'droppedValue'があるはずです。 – Angelo

答えて

3

2つの妥当なポジションがあります。

  • Disposeを2回呼び出すことができます。これはドキュメンテーションでサポートされており、disposedValueのチェックは必要ありません。

  • Disposeを2回呼び出すことはできません。しかし、フォームを2回も処理しないでください。もしそうでなければ、あなたのdisposedValueチェックの必要はありません。一部の子オブジェクトは、あなたの周りに仕事をしたいDisposeのバグの実装を持っている場合Dispose内部

disposedValueチェックは意味があります。

+1

私は '_ifの中には、あなたが回避したいDisposeのバグのある実装を持っています。' 'に同意します。私は「処分」を続けたいと思っています。 – Angelo

0

無料、管理対象、または管理対象外の要素が重要でない場合は、disposedValueまたはその他のメカニズムが必要です。

Disposeで行う仕事は、他人のDisposeと呼ぶことだけです(再実装が可能な場合)ので、何もする必要はありません。

この特定のケースでは、あなたは「droppedValue」フラグを使用する必要はないと書いています。

Disposeの最も一般的な実装パターンには、このようなフラグ(継承者から使用できる保護されたプロパティ)が含まれていると言われています。

+0

私は '_に同意する必要があります。あなたが解放、管理、または管理されていない要素は関係ありません。 – Angelo

関連する問題