1

アプリケーションのメモリリークが原因でリソースを解放する必要があるため、このクラスを破棄する方法がわからないため、速度が低下します。一部のプロパティはIDisposableを実装していないため、以下のクラスを破棄する方法がわかりません。私はC#にかなり慣れていないので、応答を複雑にしすぎないようにしてください。

public class CellItem: IDisposable
    {
        private Timer foo = new Timer();

        public int MedicationDispenseId { get; set; }
        public Enumerations.Timeslot Timeslot { get; set; }
        public DateTime DateAdministered { get; set; }

        protected override void Dispose(bool disposing)
        {
            disposing = true;
            Dispose(disposing);
        }

    }
4

4 に答える 4

7

そのコードにはバグがあります:

protected override void Dispose(bool disposing)
{
            disposing = true;
            Dispose(disposing);
}

再帰的であり、スタックスペースが不足する前にしばらくそこに座っている場合.

あなたの質問に答えるには: それがあなたのコードであれば、Disposeメソッドを変更して適切なリソースを解放するだけです。そうでない場合は、それを書いた人に修正を依頼するか、独自の (バグのない) バージョンを作成することを検討する必要があります。

于 2013-08-23T13:05:45.263 に答える
0

開始するには、次のリソースを読んでみてください。

I使い捨て

http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

キーワードの使用

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

于 2013-08-23T13:05:39.577 に答える
0

フラグは、クラスの破棄が開始されたかどうかを示すフィールドではなく、インターフェイスを実装するパラメーターなしのメソッドからメソッドが呼び出されたときに値を渡すDisposingダミーパラメーターと見なす必要があります。パラメータはもともと、と(デストラクタ) メソッドの両方に機能を追加したい派生クラスに共通の「パッチ ポイント」を許可するように設計されましたが、実際には、派生クラスまたは封印されていないクラスがコードを実装することはほとんど適切ではありませそのようなクリーンアップを中心とした目的を持つクラスから、またはクラスから直接派生します。trueprotected virtualDisposeDisposeFinalizeFinalizeObject

ほとんどのインターフェースとは異なり、 「コントラクト」はそれを実装するクラスにIDisposable義務を課さないことに注意してください。代わりに、多くのタイプのクラスが、その構築を要求するコードに特定の譲渡可能な契約上の義務を課すことができる標準的な手段として存在します。典型的なオブジェクトは、追って通知があるまで他のエンティティに代わりに何かを行うように依頼し、そのサービスが不要になったときに通知を受けることを他のエンティティに約束し、そのような通知を行う目的でそのメソッドを使用します。実装する多くのクラスのコンストラクター契約では、呼び出し元がオブジェクトを放棄する前に、次のいずれかを確実にする必要があります。IDisposableDisposeIDisposableDisposeまたは、そうすることを約束する他のエンティティにそれを渡します。

于 2013-08-27T21:54:39.507 に答える