問題タブ [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.
c# - この IDisposable の実装は正しいですか?
IDisposable インターフェイスを実装するためのすべてのルールを思い出すことはできないので、これらすべてを処理し、IDisposable を実装しやすくする基本クラスを考え出そうとしました。この実装がそのままでよいか、それとも改善できる点があるかどうか、あなたの意見を聞きたかっただけです。この基本クラスのユーザーは、そこから派生し、2 つの抽象メソッドReleaseManagedResources()
とを実装することになっていReleaseUnmanagedResources()
ます。コードは次のとおりです。
c# - これは、IDisposable を使用してオブジェクトを破棄するのに正しいですか?
IDisposable インターフェイスを実装するクラスがあります。AsyncDownloadString を使用してデータをダウンロードするために Web クライアントを使用しています。
コンストラクターと Web クライアントの using ステートメント内でイベント ハンドラーを正しく宣言したかどうか疑問に思っています。Dispose メソッドでイベント ハンドラーを削除するこの正しい方法はありますか?
これは IDisposable インターフェイスを使用する正しい方法ですか?
c# - C#でのFinalize/Disposeメソッドの使用
C#2008
私はこれにしばらく取り組んできましたが、コードでのfinalizeメソッドとdisposeメソッドの使用についてはまだ混乱しています。私の質問は以下の通りです:
管理されていないリソースを処分するときに必要なのはファイナライザーだけであることを私は知っています。ただし、管理されていないリソースを呼び出す管理されたリソースがある場合でも、ファイナライザーを実装する必要がありますか?
ただし、管理されていないリソースを直接または間接的に使用しないクラスを開発する場合、
IDisposable
そのクラスのクライアントが「usingステートメント」を使用できるようにを実装する必要がありますか?クラスのクライアントがusingステートメントを使用できるようにするためだけにIDisposableを実装することは可能でしょうか?
/li>Finalize / disposeの使用法を示すために、以下の簡単なコードを開発しました。
/li>
ソースコードに関する質問:
ここではファイナライザーを追加していません。通常、ファイナライザーはGCによって呼び出され、ファイナライザーはDisposeを呼び出します。ファイナライザーがないので、いつDisposeメソッドを呼び出しますか?それを呼び出さなければならないのはクラスのクライアントですか?
したがって、この例の私のクラスはNoGatewayと呼ばれ、クライアントは次のようにクラスを使用して破棄できます。
実行がusingブロックの最後に達すると、Disposeメソッドが自動的に呼び出されますか、それともクライアントはdisposeメソッドを手動で呼び出す必要がありますか?すなわち
/li>WebClient
クラスでクラスを使用していNoGateway
ます。インターフェイスをWebClient
実装しているため、これは間接的に管理されていないリソースを使用することを意味しますか?これに従うための厳格なルールはありますか?クラスが管理されていないリソースを使用していることをどのように知ることができますか?IDisposable
WebClient
datatable - DataSetとDataTableをDispose()する必要がありますか?
DataSetとDataTableはどちらもIDisposableを実装しているため、従来のベストプラクティスでは、Dispose()メソッドを呼び出す必要があります。
ただし、これまで読んだことから、DataSetとDataTableには実際には管理されていないリソースがないため、Dispose()は実際には多くのことを行いません。
さらに、using(DataSet myDataSet...)
DataSetにはDataTablesのコレクションがあるため、使用することはできません。
したがって、安全のために、myDataSet.Tablesを反復処理し、各DataTablesを破棄してから、DataSetを破棄する必要があります。
それで、すべてのDataSetとDataTableでDispose()を呼び出すのは面倒な価値がありますか?
補遺:
DataSetを破棄する必要があるとお考えの方へ:一般に、破棄のパターンはusing
orを使用するtry..finally
ことです。これは、Dispose()が呼び出されることを保証するためです。
ただし、これはコレクションにとって醜いものになります。たとえば、Dispose()の呼び出しの1つが例外をスローした場合はどうしますか?次の要素を処分し続けることができるように、それを飲み込みますか(これは「悪い」です)?
または、myDataSet.Dispose()を呼び出すだけで、myDataSet.TablesのDataTablesを破棄することを忘れることをお勧めしますか?
c# - カスタムオブジェクトの関数でC#の'using'ステートメントを使用して、IDisposableを実装する必要がありますか?
私は次のようなsqlConnectionマネージャークラスを持っています:
次のような'using'ステートメントで関数を使用する場合:
usingステートメントconn.Connection()
はSqlConnectionオブジェクトを返すため、接続を自動的に破棄しますか?または、SqlConnクラスにIDisposableとカスタムDisposeメソッドを実装する必要がありますか?
これはまったく良い方法ですか?レガシーコードを使用していますが、まだORMを使用できませんが、この既存のパターンを単純化してSQL接続を管理/作成する方法はありますか?
.net - USING文を使うべきケース一覧
「File と Font は、アンマネージド リソース (この場合はファイル ハンドルとデバイス コンテキスト) にアクセスするマネージド型の例です。他にも多くの種類のアンマネージド リソースとそれらをカプセル化するクラス ライブラリ型があります。そのような型はすべて、IDisposable インターフェイスを実装する必要があります。ルールとして、IDisposable オブジェクトを使用する場合は、using ステートメントで宣言してインスタンス化する必要があります。」-MSDN
USING ステートメントを使用する必要がある場合 (FILE や FONT などのアンマネージド リソースにアクセスするマネージド型) のリストはありますか?
c# - C# で「使い捨て」キーワードを検討する
使い捨てオブジェクトが .Net でどのように実装されているかについての意見はありますか? また、IDisposable クラスの実装の反復性をどのように解決しますか?
IDisposable 型は、本来あるべき一流の市民ではないと感じています。あまりにも多くのことが開発者のなすがままになっています。
具体的には、使い捨てのものを正しく実装し、適切に廃棄することを確実にするために、言語とツールのサポートが改善されるべきではなかったのではないかと思います。
たとえば C# では、使い捨てセマンティクスを実装する必要があるクラスを次のように宣言できたらどうなるでしょうか。
この場合、コンパイラは IDisposable インターフェイスの実装を簡単に生成できます。デストラクタ ~MyDisposableThing は、マネージド リソースを解放する実際の Dispose メソッドに変換できます。
中間の C# コードは次のようになります。
これにより、コードがよりクリーンになり、ボイラープレートの破棄コードが少なくなり、マネージド リソースを破棄する一貫した方法が得られます。IDisposable を手動で実装することは、エッジ ケースとアンマネージ リソースに対して引き続きサポートされます。
インスタンスが適切に破棄されるようにすることは、別の課題です。次のコードを検討してください。
リーダー変数がメソッドのスコープを超えて存続することはありませんが、GC が破棄するまで待機する必要があります。この場合、コンパイラは、StreamReader オブジェクトが明示的に破棄されていないというエラーを発生させる可能性があります。このエラーは、開発者に using ステートメントでラップするように促します。
c# - I使い捨て
私は、問題を解決できない終了したばかりのクラスを動作させるように適応させようとしています。私の質問は、//CloseHandle (ハンドル) を閉じるハンドルを特定する方法です。私の問題は、次のコードを適応させることができないことです。
c# - C#:IEnumeratorusing ステートメントで
このメソッドがMoreLinqでどのようSingleOrFallback
に実装されているかを知りたいと思っていたところ、これまでに見たことのないものを発見しました。
がステートメントIEnumerator<T>
にあるのはなぜですか? これは、 on anusing
を使用するときに考慮すべきことですか?foreach
IEnumerable<T>
副次的な質問:このメソッドは正確には何をしますか? ソース シーケンスにアイテムが 1 つだけ含まれていない場合は常にフォールバック アイテムを返しますか?