問題タブ [idisposable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
11199 参照

c# - WindowsFormsHost などの IDisposable WPF コントロールはいつ破棄できますか?

WPF コントロールの WindowsFormsHost は、IDisposable を継承しています。

上記のコントロールのいくつかを含む複雑な WPF ビジュアル ツリーがある場合、シャットダウン中に IDispose を呼び出すためにどのイベントまたはメソッドを使用できますか?

0 投票する
12 に答える
9745 参照

c# - .NET IDisposable オブジェクトの処理

私は C# で作業していますが、usingブロックを使用して を実装するオブジェクトを宣言することについてはかなり怠慢IDisposableでした。しかし、いつ滑っているかを簡単に知る方法はありません。Visual Studio はこれをまったく示していないようです (何か足りないのでしょうか?)。何かを宣言するたびにヘルプをチェックして、どのオブジェクトが使い捨てで、どのオブジェクトが使い捨てでないかについて百科事典的な記憶を徐々に構築することになっているのでしょうか? 不必要で、苦痛で、エラーが発生しやすいようです。

これをどのよう処理しますか?

編集:

関連する質問のサイドバーを見て、とにかくオブジェクトのファイナライザーによって呼び出されることになっていることを明確にする別の質問を見つけました。Dispose()したがって、自分で呼び出さなくても、最終的には発生するはずです。つまり、使用しなくてもメモリリークは発生しませんusing(これは、私がずっと心配していたことだと思います)。唯一の注意点は、ガベージ コレクターは、オブジェクトが管理されていないものとして保持している余分なメモリの量を知らないため、オブジェクトを収集することによって解放されるメモリの量を正確に把握できないことです。これにより、ガベージ コレクターのパフォーマンスが通常よりも低下します。

要するに、私が逃したとしても、それは世界の終わりではありませんusing. 何かが少なくとも警告を生成することを願っています。

(トピック外: 別の質問にリンクするための特別なマークダウンがないのはなぜですか?)

編集:

わかりました、わかりました、騒ぎ立てるのはやめてください。それは、コールするのが非常に重要な、すべてが発射された劇的なシマリスレベルです。Dispose()

今。それを考えると、なぜそんなに簡単に — 地獄、なぜそれが許されているのでしょう — 間違ったことをするのですか? あなたはそれを正しく行うために最善を尽くさなければなりません。他のすべてのようにそれを行うと、ハルマゲドンが発生します(明らかに)。カプセル化はここまでですよね?

[立ち去る、うんざり]

0 投票する
1 に答える
616 参照

idisposable - 欠落している IDisposable 実装に対する NDepend CQL クエリ

この質問が探しているクエリは、IDisposable の実装に関するすべての小さな問題を見つけるのに十分ではないことを認識していますが、早期警告はすべて重要なので、取得できるものを取り上げます。

IDisposable を実装していないが、実装しているフィールドが 1 つ以上あるすべてのクラスをリストする NDepend の CQL クエリを誰かが思いついたかどうかを知りたいです。バグ (つまり、誰かが IDisposable 実装のフィールド タイプをチェックするのを忘れた)、またはコードの進化 (つまり、どこかのフィールドで使用されるクラスに IDisposable が追加される) によって、クラスがこのクエリの結果リストに含まれる可能性があります。すべての使用状況が更新されることなく後日)。

IDisposable を実装していないすべてのクラスを検索する単純なクエリは次のとおりです。

ただし、これはもちろん、クラスが上記のルールの IDisposable を実装する必要があるかどうかをチェックしません。

誰かそのようなクエリを持っていますか?私はまだCQLに慣れてきているので、この部分はわかりません。

0 投票する
1 に答える
5084 参照

.net - Managed C++ で IDisposable をどのように破棄しますか?

マネージ C++ (.NET 2.0) で IDisposable オブジェクト (FileStream^ fs) を破棄しようとしていますが、エラーが発生しています

Dispose' : 'System::IO::FileStream のメンバーではありません

代わりにデストラクタを呼び出す必要があると書かれています。呼び出します

FileStream オブジェクトで dispose メソッドを呼び出しますか? Dispose を呼び出せないのはなぜですか?

0 投票する
2 に答える
11124 参照

c# - 登録されていないイベント ハンドラーが原因でメモリ リークが発生する

メモリ リークのある Web アプリケーションを保守しています。

Red Gate ANTS メモリ プロファイラを使用して調査したところ、メモリ リークはビジネス レイヤのイベント ハンドラが原因であることがわかりました。

アイテムの日付が変更されたときにコレクションを再ソートできるように、追加された各アイテムにイベント ハンドラーを登録するコレクションがあります。このイベント ハンドラが原因のようです。

このアプリケーションのビジネス レイヤーは非常に複雑であるため、コレクションとその項目をメモリ内に保持すると、他のオブジェクトも一緒にドラッグされます。

コレクションに IDisposable を実装し、Dispose メソッドのイベント ハンドラーを削除しました。

ただし、コレクションへのすべての参照を using または try/catch ブロックでラップできないため、IDisposable を実装しても役に立ちません。このコレクションは、私が制御できないアプリケーションの一部で使用されています。

これらのイベント ハンドラーをクリアして、このメモリ リークを解決するにはどうすればよいですか?

0 投票する
3 に答える
1096 参照

.net - IDisposable Winform

Winform に IDisposable を実装するためのベスト プラクティスは何ですか?

  • System.Windows.Forms.Form を拡張するダイアログがあります
  • 生成された designer.cs には、仮想 Dispose(bool) メソッドの実装が既に含まれています。
  • 私のフォームには、IDisposable を実装する手動で追加されたフィールドがあります

生成されたコードで Dispos(bool) オーバーライドにフックして、手動で追加した IDisposable オブジェクトを破棄できることが理想的です。これを適切に行う方法に関する推奨事項はありますか?

ありがとう。

スコット

0 投票する
9 に答える
19112 参照

.net - IDisposable を使用してイベントのサブスクライブを解除する

WinForms コントロールからのイベントを処理するクラスがあります。ユーザーが何をしているかに基づいて、クラスの 1 つのインスタンスを参照し、同じイベントを処理するために新しいインスタンスを作成しています。最初にイベントから古いインスタンスのサブスクライブを解除する必要があります - 簡単です。できれば非独占的な方法でこれを行いたいのですが、これは IDisposable の仕事のようです。ただし、ほとんどのドキュメントでは、管理されていないリソースを使用する場合にのみ IDisposable を推奨しているため、ここでは適用されません。

IDisposable を実装し、Dispose() でイベントの登録を解除すると、その意図を逸脱することになりますか? 代わりに Unsubscribe() 関数を提供してそれを呼び出す必要がありますか?


編集:これは、私が何をしているのかを示すダミーコードです(IDisposableを使用)。私の実際の実装は、いくつかの独自のデータ バインディングに関連しています (長い話)。

実際のコードでは、「EventListener」クラスがより関与しており、各インスタンスは一意に重要です。これらをコレクションで使用し、ユーザーがクリックするたびに作成/破棄します。


結論

少なくとも今のところ、gbjbaanb の回答を受け入れています。使い慣れたインターフェイスを使用することの利点は、アンマネージ コードが含まれていない場合に使用することの潜在的な欠点を上回ると思います (このオブジェクトのユーザーは、どうしてそれを知ることができるでしょうか?)。

誰かが同意しない場合は、投稿/コメント/編集してください. IDisposable に対してより良い議論ができる場合は、受け入れられた答えを変更します。

0 投票する
5 に答える
2109 参照

c# - IDisposableインターフェースを実装する目的は何ですか?

IDisposableインターフェースを実装する目的は何ですか?いくつかのクラスがそれを実装しているのを見ましたが、その理由がわかりません。

0 投票する
3 に答える
4436 参照

.net - Best practice: Override OnDispose(bool disposing) vs Disposed event on Component

In .Net the Component class exposes a Disposed event. It also provides a protected member OnDispose(bool disposing).

What is the best practice for a custom component that extends Component? Override OnDispose(bool) or attach an event handler to Disposed on construction?

My feeling is that one should override OnDispose(bool) and seal the class.

Thoughts?

0 投票する
2 に答える
2544 参照

c# - usingステートメントでLINQが実行を延期する方法

私が次のものを持っていると想像してください:

ドキュメントによると、linqの実行は、foreachの行で発生する結果を実際に列挙するまで延期されます。ただし、usingステートメントは、MyFunct()の呼び出しの最後にオブジェクトを確実に収集するように強制する必要があります。

ディスポーザが実行されたり、結果が実行されたりするのはいつですか?

私が考えることができるのは、遅延実行がコンパイル時に計算されることだけです。したがって、実際の呼び出しはコンパイラによってforeachの最初の行に移動され、usingが正しく実行されますが、foreach行まで実行されませんか?助けることができる教祖はそこにいますか?

編集:注:このコードは機能しますが、方法がわかりません。

少し読んだところ、コードでToList()拡張メソッドを呼び出したことに気づきました。これはもちろん結果を列挙します。チェックされた回答の動作は、実際に回答された質問に対して完全に正しいものです。

ご迷惑をおかけして申し訳ありません。