1

以下は、私が使用しているクラス全体です。2 つの質問があります。1 つは、これが Dispose() の適切な使用法であり、また、なぜメソッド 'dispose' のオーバーロードが 1 引数を取らないというエラーが発生するのですか?

システムを使用する;
System.Collections.Generic の使用;
System.Linq を使用します。
System.Text を使用します。

名前空間クローラー
{
    クラス LoggingClass : IDisposable
    {
        public void GenericLogging(文字列 systemMsg、文字列 SystemClass、文字列 SystemSection、文字列 ID、文字列 FixID、文字列 baseURL、文字列 mysqlQueryName、文字列 mysqlQuery)
        {
            string Loggingall = " tblLogs に挿入 " +
                            "set SystemMsg='" + systemMsg.Replace("'","''") + "'" +
                            ",SystemClass = '" + SystemClass.Replace("'", "''") + "'" +
                            ",SystemSection = '" + SystemSection.Replace("'", "''") + "'" +
                            ",ID = '" + CarID.Replace("'", "''") + "'" +
                            ",FixID = '" + FixID.Replace("'", "''") + "'" +
                            ",baseurl = '" + baseURL.Replace("'", "''") + "'" +
                            ",mysqlqueryName = '" + mysqlQuery.Replace("'", "''") + "'" +
                            ",mysqlquery = '" + mysqlQuery.Replace("'", "''") + "'" +
                            ",TimeStamp = Now()";
            MySQLProcessing.MySQLProcessor MYSQLP = 新しい MySQLProcessing.MySQLProcessor();
            MYSQLP.MySQLInsertUpdate(Loggingall, "Loggingall");
        }

        public void Dispose()
        {
            破棄 (真);
            // ファイナライズ キューから抜けます
            // このオブジェクトのファイナライズ コードを防止する
            // 2 回目の実行から。
            GC.SuppressFinalize(これ);
        }
    }
}

これが私の更新されたコードです:}

これは正しい呼び方ですか?Disposeも呼び出す必要がありますか?

4

3 に答える 3

6

他の回答者が述べたように、IDisposable を実装する必要はないようです。クラス フィールドがまったくないので、クリーンアップするものは何もありません。

あなたが示した以上のものがクラスにあると仮定すると、IDisposable を実装するためのパターンに従っていることになりますが、まだ半分しか終わっていません。

パターンとIDisposable.Dispose()ファイナライザー ( ~LoggingClass) の両方が共通のメソッド を呼び出しますDispose(bool)。このDispose(bool)メソッドでは、ブール値が true に渡された場合はマネージド リソースとアンマネージド リソースの両方をクリーンアップし、false に渡された場合はアンマネージド リソースのみをクリーンアップする必要があります。

IDisposable の実装に使用するコードを次に示します。

~LoggingClass()
{
    this.Dispose(false);
}

protected bool Disposed { get; private set; }

public void Dispose()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    if (!this.Disposed)
    {
        if (disposing)
        {
            // Perform managed cleanup here.

        }

        // Perform unmanaged cleanup here.

        this.Disposed = true;
    }
}

編集

更新されたコードを追加してから削除したようです。しかし、ここにあなたがそれをどのように呼んでいるのかについての私のコメントがあります.

現在使用している GenericLogging メソッドでは、IDisposable はまったく必要ありません。ただし、コードを改善するためにいくつかのことを行います。

  1. GenericLogging メソッドではなく、コンストラクターで MySQLProcessing.MySQLProcessor インスタンスを作成します。
  2. Dispose(bool) のマネージド クリーンアップ セクションで、MySQLProcessing.MySQLProcessor.Dispose() (または .Close()、またはそのクラスが持つもの) を呼び出します。
  3. LoggingClass オブジェクトをより長く保持します。はい、あなたが実証したのは適切に実装されたusingステートメントですが、コード内で何千ものオブジェクトを作成および破棄することになります。1 つの LoggingClass オブジェクトを作成し、1 つのログ ステートメントだけでなく、プログラム全体にわたって保持します。
  4. アプリケーションが終了しようとしているときに LoggingClass.Dispose() を呼び出します。これは手動で行います (usingステートメントではありません)。
于 2012-04-05T23:51:44.400 に答える
0

いいえ、これは の適切な使用法ではありませんIDisposable。つまり、実際には何も処分していないように見えるからです。これもエラーの原因です。自動生成されたコードをいくつか取り出しました。元に戻し (次のようになります)、コメントに従います。

private bool disposed = false;

protected virtual void Dispose(bool disposing)
{
    if(!disposed) {
        disposed = true;

        if(disposing) {
            // Clean up managed resources, like files or GDI objects
        }

        // Clean up unmanaged resources, like COM components
    }
}
于 2012-04-05T23:48:10.953 に答える
-1

No Overload for method 'dispose' takes 1 argument というエラーが表示されるのはなぜですか。

boolメソッドのを受け入れるオーバーロードがないためですDispose()

これは Dispose() の適切な使用法であり、また

わかりにくいです。クラスには、表示されたマネージド リソースまたはアンマネージド リソースがないため、このメソッドは基本的に何もしません。(実際にはGC.SuppressFinalize(this)、事態を悪化させる呼び出しを行います)

于 2012-04-05T23:48:27.663 に答える