3

IDisposable インターフェイスと C# の using キーワードについて、どのクラスで使用できるか少し混乱しています。

using (DataSet studentDS = GetMyStudentDS())
{
    // here comes some code
}

DataSet クラスから継承されたクラスがガベージ コレクターによってファイナライズされていないことがわかりました。そうであれば、それを using ブロックに入れて、ジョブが完了したら手動で行うことをお勧めします。誰かがすべての利益のためにそれを簡単に説明できますか. ありがとう。

4

6 に答える 6

4

それをusingブロックに入れるのは良い習慣ですか

はい、そうです。DataSetとしてIDisposible インターフェイスを実装します。DataSet はMarshalByValueComponentクラスを拡張します。MarshalByValueComponentクラスは IDisposable を実装します。

どの派生型にも IDisposable が実装されます。明示的に実装しない (つまり、IDisposable.Dispose をオーバーライドする) 場合は、基本メソッド (DataSet.Dispose) が呼び出されます。

Finalizerに関しては、開発者が Dispose メソッドの呼び出しに失敗した (またはブロックの使用を忘れた) 場合でも、アンマネージ リソースが確実にクリーンアップされるようにするための別の概念です。

于 2012-05-29T07:21:39.293 に答える
4

私は個人的にはそれを使用しませんDataSetusingファイル リーダー、データベース、SharePoint 接続などの接続を閉じて破棄する必要がある場合は、ステートメントを使用します。C# はマネージ言語であり、CLR がガベージ コレクションを処理します。DataSet を使用する場合などは、この原則に固執します (CLR に任せてください)。

http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.80).aspx

http://www.w3enterprises.com/articles/using.aspx

于 2012-05-29T07:22:05.110 に答える
2

ファイナライザー (デストラクタ) と IDisposable パターンには違いがあります。ファイナライザーは非決定論的なタイミングで GC によって呼び出され、クラスに関連付けられたアンマネージ リソースをクリーンアップし、インスタンスが占有していたメモリを解放するために使用されます。デストラクタが実行されると、制御できなくなります。

IDisposable は、確定的なタイミングでオブジェクトをクリーンアップするために使用されます。オブジェクトが占有しているメモリを解放するわけではありませんが、ファイルやデータベース接続を閉じるためによく使用されます...

そのため、一般的な規則として、オブジェクトが IDisposable を実装している場合、usingリソースをできるだけ早く解放するために、そのインスタンスをキーワードでラップすることをお勧めします。

于 2012-05-29T07:20:23.863 に答える
0

C# ではusing、実装するすべてのもので使用できますIDisposable。なんで?using は単なるシンタックス シュガーだからです。using(obj){/*somecode*/}実際には次のようなものです:

try
{
    /*somecode*/
}
finally
{
    if(obj!=null) obj.Dispose();
}

Typed を使用している場合DataSet、自動生成されたクラスがオーバーライドしないことに気付いたかもしれませんDispose(bool)。自動Dispose生成されたテーブルと列には何もしません。Dispose(bool)自動生成された TypedDataSet (部分ファイル内) でオーバーライドして、データ セットのメモリを解放する (実際に問題がある) のを支援します。次のようにします。

protected override void Dispose(bool disposing)
{
    foreach (DataTable tab in this.Tables)
    {
        if (tab != null)
        {
            tab.Clear();
            tab.Columns.Clear();
            tab.Dispose();
        }
    }
    this.Tables.Clear();
    base.Dispose(disposing);
}

そして今using、これSataSetを使用することは理にかなっています。

于 2012-05-29T07:41:01.540 に答える
0

DataSet は を実装IDisposableしますが、ファイナライズを抑制します。
したがって、実際には必要ありません。アンマネージ コードは導入されません。
ステートメントでラップしないでください。ただし、SQL 接続またはデータ リーダーの前後でキーワードusingを使用することを忘れないでください。using

于 2012-05-29T07:25:35.857 に答える
-1

はい、間違いなくブロックを使用する際に任意のオブジェクト初期化コードを使用できます。使用による副作用はありません。どのようなシナリオでも、オブジェクトのガベージ コレクションを 100% 確実にしたい場合は、ブロックを使用して保持します。

于 2012-05-29T07:23:47.327 に答える