問題タブ [dispose]
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.
.net - .net でクラスを破棄するには?
.NET ガベージ コレクターは最終的にメモリを解放しますが、そのメモリをすぐに戻したい場合はどうすればよいでしょうか。MyClass
呼び出すクラスで使用する必要があるコードは何ですか?
の変数とオブジェクトによって使用されているすべてのスペースを解放しますMyClass
か?
c# - 必要な関数呼び出しの強制
次のように使用される C# の「ステータス」クラスがあります。
あなたはアイデアを得る。MyFunction のすべての呼び出し元は、返された Status を確認する必要があります。
ただし、怠惰な呼び出し元はステータスを無視できます。
また
これを不可能にすることは可能ですか?例外のスローなど
一般に、特定の関数を呼び出さなければならない C# クラスを作成することは可能ですか?
C++ バージョンの Status クラスでは、デストラクタでプライベート bool bIsChecked に対するテストを記述し、誰かがこのインスタンスをチェックしない場合にベルを鳴らすことができます。
C# の同等のオプションは何ですか? 「C#クラスにデストラクタは必要ない」とどこかで読みました
IDisposable インターフェイスの Dispose メソッドはオプションですか?
この場合、解放するアンマネージ リソースはありません。さらに、GC がいつオブジェクトを破棄するかは決定されません。最終的に破棄されたときに、その特定の Status インスタンスをいつどこで無視したかを知ることは可能ですか? 「using」キーワードは役に立ちますが、怠惰な呼び出し元には必要ありません。
.net - ガベージコレクターはIDisposableを呼び出しますか?
.NET IDisposableパターン は、ファイナライザーを作成し、IDisposableを実装する場合、ファイナライザーが明示的にDisposeを呼び出す必要があることを意味します。これは論理的であり、ファイナライザーが必要とされるまれな状況で私が常に行ってきたことです。
ただし、これを実行するとどうなりますか。
ファイナライザーなどを実装しないでください。フレームワークはDisposeメソッドを呼び出しますか?
はい、私はこれがばかげているように聞こえることを理解しています、そしてすべての論理はそれがそうではないことを意味します、しかし私はいつも頭の後ろに2つのものを持っていました。
数年前の誰かが、実際にはそうするだろうと私に言ったことがあり、その人は「自分のことを知っている」という非常に確かな実績を持っていました。
コンパイラ/フレームワークは、実装するインターフェイスに応じて他の「魔法」のことを実行します(たとえば、foreach、拡張メソッド、属性に基づくシリアル化など)。したがって、これも「魔法」である可能性があります。
私はそれについて多くのことを読み、多くのことが暗示されてきましたが、この質問に対する決定的な「はい」または「いいえ」の答えを見つけることができませんでした。
c# - C#でC++スタイルのデストラクタを実行するには?
Dispose
経由の関数を持つ C# クラスがありますIDisposable
。ブロック内で使用することを意図しているusing
ため、処理する高価なリソースをすぐに解放できます。
問題は、 が呼び出される前に例外がスローされたときにバグが発生し、プログラマーがorDispose
の使用を怠ったことです。using
finally
C++ では、これについて心配する必要はありませんでした。クラスのデストラクタへの呼び出しは、オブジェクトのスコープの最後に自動的に挿入されます。そのような事態を回避する唯一の方法は、 new 演算子を使用してオブジェクトをポインターの背後に保持することですが、プログラマーにとって余分な作業が必要になるのは、using
.
using
ブロックをC#で自動的に使用する方法はありますか?
どうもありがとう。
アップデート:
ファイナライザーの回答を受け入れない理由を説明したいと思います。これらの答えは技術的には正しいですが、C++ スタイルのデストラクタではありません。
これが私が見つけたバグであり、本質的なものに縮小されています...
使用FXCop
することは素晴らしい提案ですが、それが私の唯一の答えである場合、私の質問は C# の人々への嘆願になるか、C++ を使用する必要があります。ネストされた 20 の using ステートメントはありますか?
.net - SqlCommand.Dispose は接続を閉じますか?
このアプローチを効率的に使用できますか?
私の懸念は: SqlCommand の Dispose メソッド (using ブロックを終了するときに呼び出される) は、基になる SqlConnection オブジェクトを閉じるかどうかです。
vb.net - VB.NET - IDisposable を実装するときに Finalize メソッドを追加する必要がありますか?
Visual Studio で " Implements IDisposable
" という行を入力すると、IDE によって次のものが自動的に追加されます。
- メンバー
disposedValue
変数 - a
Sub Dispose() Implements IDisposable.Dispose
- a
Sub Dispose(ByVal disposing As Boolean)
はそのDispose()
ままにして、クリーンアップ コードを に配置する必要がありますDispose(disposing)
。
ただし、Dispose Finalize パターンSub Finalize()
は、 callをオーバーライドする必要があることも示していますDispose(False)
。なぜIDEもこれを追加しないのですか? 自分で追加する必要がありますか、それとも何らかの方法で暗黙的に呼び出されますか?
編集: IDE が必要なものの 80% を自動的に追加するのに、Finalize メソッドを省略している理由がわかりませんか? この種の機能の要点は、これらのことを忘れないようにすることではないでしょうか?
EDIT2:素晴らしい回答をありがとうございました。これは完全に理にかなっています!
c# - ThreadStatic オブジェクトの確定的な破棄
ThreadStatic 属性は、静的変数をスレッドごとに一意として宣言します。そのような変数を正しく処分する簡単なパターンを知っていますか?
ThreadStatic の前に使用したのは ThreadContextManager です。すべてのスレッドには、すべてのスレッド固有の情報を保持する ThreadContext が割り当てられました。いくつかのスレッドを生成し、それらを機能させました。次に、それらがすべて終了したら、ThreadContentManager を破棄しました。これにより、IDisposable の場合はすべてのコンテキストが破棄されました。
このパターンを ThreadStatic オブジェクトにすぐに変換する方法がわかりません。スレッドが死ぬため、オブジェクトは最終的に破棄され、スレッドを参照するものは何もありません。ただし、可能な限り決定論的な破棄を優先します。
アップデート
私は実際にスレッドを直接制御するわけではありません。タスクを実行する ThreadPool を持つ Microsoft CCR を使用しています。すべてのタスクが完了したら、Dispatcher (スレッドプールを保持する) を破棄します。問題は、「スレッドのメイン関数の最後に」何もする機会がないため、スレッドの実行の最後に手動で処理を行うことができないということです。どうにかして、スレッドの外部からスレッドの静的オブジェクトにアクセスできますか?
c# - ファイナライザーと破棄
BackgroundWorker
スレッドが常に実行されているという名前のクラスがあります。このスレッドをオフにするには、 to という名前のインスタンス変数がstop
である必要がありますtrue
。
クラスの使用が終了したときにスレッドが確実に解放されるようにするために、IDisposable
を呼び出すファイナライザーを追加しましたDispose()
。それが実際にこのスレッドを終了させると仮定するとstop = true
、このシペットは正しいですか? ファイナライザーから呼び出しDispose
てもいいですよね?
継承するDispose
場合、ファイナライザーは常に呼び出す必要がありますよね?object
IDisposable
c# - Dispose 機能を C# UserControl に追加するにはどうすればよいですか?
UserControl を実装するクラスがあります。.NET 2005 では、次のような MyClass.Designer.cs 部分クラス ファイルに Dispose メソッドが自動的に作成されます。
独自の Dispose 機能を追加したい場合、どこに配置しますか? このファイルは生成されるので、ここにコードを追加して、吹き飛ばされる危険を冒したくありません。
c# - IDisposable オブジェクト参照が破棄されているかどうかは、どのようにわかりますか?
参照が破棄されたオブジェクトへの参照であるかどうかを確認する方法、またはその他の軽量な方法はありますか?
PS - これは単なる好奇心です (製品コードではなく、よく眠ってください)。はい、ObjectDisposedException
オブジェクトのメンバーにアクセスしようとすると をキャッチできることはわかっています。