3

私はこのようなことを試しました:

 using (DataRow newRow = summary.NewRow())
    {
        summary.Rows.Add(newRow);
    }

しかし、うまくいきません。エラーが発生します:

'System.Data.DataRow': using ステートメントで使用される型は、'System.IDisposable' に暗黙的に変換可能でなければなりません

DataRow をこのように破棄できない理由、および/またはこのようなことを行う同様の方法を誰かが説明してもらえますか? ありがとう。

4

5 に答える 5

3

一部のオブジェクトをusingブロック内で使用するには、 IDisposable インターフェイスを実装する必要があり ます。IDisposable を実装していないため、エラーが発生しています。最初に DataRow を破棄する理由がよくわかりません。DataRow

ステートメント C# の使用

IDisposable オブジェクトを正しく使用するための便利な構文を提供します。

編集:(新しい行を再利用したいというコメントの場合)

すべきではありません。DataTable は新しい行の参照を保存します。新しく作成された行を再度使用すると、行がデータテーブルに既に存在するという例外が発生するため、行を追加するには、常にDataTable.NewRowメソッドを使用して新しい行を作成する必要があります。

于 2013-04-03T11:04:33.890 に答える
1

MSDNから:

using ステートメントに提供されるオブジェクトは、IDisposable インターフェイスを実装する必要があります。このインターフェイスは、オブジェクトのリソースを解放する Dispose メソッドを提供します。

DataRowDispose()メソッドを提供しません。

これで、 new を追加するときに、オブジェクトのコピーではなく新しい行への参照を実際に格納するDataRowため、それを破棄する必要はありません (破棄することもできません) 。Rows.Addしたがって、行を作成して のAdd()メソッドに渡すだけDataRowCollectionで、新しい行を破棄する必要はありません。

コメントに基づいて:Add()メソッドに参照を渡すと、参照のコピーがテーブルに格納されます。その後、同じ参照を自由に使用して新しいオブジェクトを作成し、参照を再度保存できます。Dispose()メソッドは、主に管理されていないリソースを解放するために使用されます。

このメソッドを使用して、このインターフェイスを実装するクラスのインスタンスが保持するファイル、ストリーム、ハンドルなどのアンマネージ リソースを閉じたり解放したりします。慣例により、このメソッドは、オブジェクトが保持するリソースの解放、または再利用のためのオブジェクトの準備に関連するすべてのタスクに使用されます。

オブジェクトが管理されていないリソースを保持していない場合、明示的に解放する必要はありません (C や C++ とは異なり) - オブジェクトを参照できない場合 (そのオブジェクトを指す参照のカウントがゼロになる場合)ガベージ コレクターがそれを処理し、ある時点で (必ずしもすぐにではなく) 自動的に削除します。

于 2013-04-03T11:06:40.340 に答える
0

using ブロックは、ブロック スコープが終了したときにメソッド IDisposable.Dispose にアクセスできる必要があります。したがって、オブジェクトは、このインターフェイスを実装して「使用」互換性があることを宣言する必要があります。

于 2013-04-03T11:06:39.480 に答える