どのようなC++スタイルdestructorsクライアントまで、フルのC#?
-
09-06-2019 - |
質問
私C#シェイクスピアの"マクベス" Dispose
機能 IDisposable
.で使用する内 using
ブロックでは高価で資源の取り扱いできます。
問題はバグ発生した場合に例外がスローされる前に Dispose
と呼ばれた、プログラマを怠利用 using
または finally
.
C++ことはありませんでした心配です。のクラスのデストラクタが自動的に挿入されるために、オブジェクトの範囲においのこうを使用することで新しいオペレーター、オブジェクトの後ろのポインタが必要な追加のプログラマーなられており、それらの中には、いによる事故のような忘れの利用 using
.
必要があります。、 using
ブロックを自動的に使用C#?
多くの感謝。
更新:
についてお話しましょうさんは受け付けておりませんのfinalizer応答となります。その答えを技術的に正確なものではありませんがC++スタイルdestructors.
こちらのバグを修正し、削減の必需品---
try
{
PleaseDisposeMe a = new PleaseDisposeMe();
throw new Exception();
a.Dispose();
}
catch (Exception ex)
{
Log(ex);
}
// This next call will throw a time-out exception unless the GC
// runs a.Dispose in time.
PleaseDisposeMe b = new PleaseDisposeMe();
を使用 FXCop
優れた提案が、これはまさに私にぴったりの答えに、私の疑問に思うになる司法取引にC#の人、または利用可能です。二子を用い諸表はいかがでしょうか?
解決
残念ながらありませんすることが直接のコードです。この課題であり、様々なコード解析ソリューションからこれらの課題です。またFxCop?ころこれらの状況およびすべての場合IDisposable物が掛け流しです。の場合はそのコンポーネントの使用以外の組織ことができませんを必要とFxCop、その書類は本当におけノンリコース:).
編集:の場合finalizersこん保証が完了となります。この場合のソリューションにより異なりますが。
他のヒント
日々目まぐるしく変わっていました以下のガイドライン
- 各IDisposableクラス 必要 てfinalizer
- きをIDisposableオブジェクトで使用する内"の"ブロックです。唯一の例外は、オブジェクトが次のどれかの場合は別のクラスの場合は、を含むクラスのIDisposableなければな電話は、会員の廃棄の方法、その実装の廃棄'.このと廃棄'すべきではないというアップデートする開発者を除く内部'廃棄の方法、このバグに記載の問題をもたらしていました。
- このコード各Finalizer始めなければならな警告やエラーログに通知することにfinalizerと呼ばれています。このようにしてい非常に良いチャンスのスポッティングなどのバグとして上記の前後でコードでは、スペシャル"ホットスポットがヒントのためのバグを試行錯誤されます。
人々の生活やまもSafeDispose方法当社のインフラを呼び出の処理方法、その引数内のtry-catchブロック(エラーログには、場合には処分の方法はいけないことになって例外をスロー).
参照: クリス-リヨン's"の提案に関するIDisposable
編集:@Quarrelsome:ひとつにすべきであるいは電話ます。SuppressFinalize内'廃棄'った場合には、オブジェクト処理をするのではなく、"再処理".
また通常の推奨をするかどうかを示すフラグのオブジェクトは、既に廃棄います。のfollwoingパターンは通常ク
class MyDisposable: IDisposable {
public void Dispose() {
lock(this) {
if (disposed) {
return;
}
disposed = true;
}
GC.SuppressFinalize(this);
// Do actual disposing here ...
}
private bool disposed = false;
}
もちろん、ロックが必ずしも必要だが、まだクラスが使用されるマルチスレッド環境は、詳しくはこちらをご参照の程おいします。
@Quarrelsome
だまされたときに呼び出されオブジェクトの移動対象外であ辺のゴミがございます。
この声明は誤解を招くとかで読んだの誤り:するものではありません保証がfinalizerが呼び出されます。だが絶対正しいとbillpg実施するべきである、finalizer;しかしないというautomaticlyのオブジェクトが範囲外になるような彼についてお聞きしましょう。 証拠, の第一弾ディストーションです 確定操作は、以下の制限があります.
実はMicrosoftための助成金Chris販売を実施。純用いたリファレンスカウンターの代わりにゴミの収集 リンク.数分で出られるがありました 相当 性能。
~ClassName()
{
}
編集(bold):
だまされたときに呼び出されオブジェクトの移動対象外であ辺では、ガベージコレクタによって しかしこれは決定論的であり保証するものではありません起こり得るのか、特定の時間.これが"Finalizer.すべてのオブジェクトとfinaliserく生活を守るために、そして最終的に合意のキューでは、ガベージコレクタによって、最終的に合意のメソッドが呼び出されて(いので技術的にパフォーマンスを宣言するのに空finalisers).
に受理された"処理パターンとしての枠組みのガイドラインは以下のようにポリソース:
public class DisposableFinalisableClass : IDisposable
{
~DisposableFinalisableClass()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// tidy managed resources
}
// tidy unmanaged resources
}
}
いかなる状況においてもその人の話処理をユ資源に位.しかしの場合は人を忘れ話に廃棄または例外を防止処分からのポリシー資源であると勧めらわずかにその後のGCが薄暗mittsでの申請に閉鎖、あるいは意外と期).
のキャッシュフローを利用finaliserクラスは、常に利用 using
ブロックとなります。
いいなだけじゃない傷を付けても直接相当のものfinalisersうC destructorsが行動とは異なります。
だっ巣 using
ブロック、そのC#コードでレイアウトデフォルトを通じて同行---
using (SqlConnection con = new SqlConnection("DB con str") )
using (SqlCommand com = new SqlCommand( con, "sql query") )
{
//now code is indented one level
//technically we're nested twice
}
使わないときは using
できるだけでなくでおすすめのフードか:
PleaseDisposeMe a;
try
{
a = new PleaseDisposeMe();
throw new Exception();
}
catch (Exception ex) { Log(ex); }
finally {
//this always executes, even with the exception
a.Dispose();
}
では管理コードC#では非常に好み、独自のメモリでも、もは十分ではない処理.れば対応でポリシー資源の多くがそうではない。
これはプログラマーを忘れを利用 削除 C++、少なくともここでは、ガベージコレクタが最終的に追いつかない。
きんを使用する必要がIDisposable場合にのみ資源でもある。マイページへのアクセスに対応するものです。IDisposableはポリシーのような資源のデータベース接続filestreamsソケットします。
よりよいデザインはこのクラスリリースは高価で資源、前処理.
例えば、そのデータベース接続は、接続を必要な時に、必要なリリース直前の実際のクラスが処理.