0

ここで何が起こっているのか説明してもらえますか?

using(DataSet ds = GetDataSet()) // will this get disposed? if yes (when?)
{
    using(DataTable dt = ds.Tables[0]) /* in this line is ds available for dt? i found some issue with this kind of statement. dt gets null after this line */
    {
          // i know that ds is available here.
          //some code
    }
}
4

6 に答える 6

1
using(DataSet ds = GetDataSet()){

  using(DataTable dt = ds.Tables[0])
  // dt will be NULL if there are no tables in ds
  {
    // both dt & ds will be available here

  }// dt will get disposed

}// ds will be disposed at this point...

これに相当するコードは次のとおりです。

try{
 DataSet ds = GetDataSet();
 try{
  DataTable dt = ds.Tables[0];
  // dt will not be null if there are any tables in ds
  // Both ds & dt available here...
 }
 finally{
  dt.Dispose();
 }
}
finally{
 ds.Dispose();
}
于 2012-04-27T20:30:22.997 に答える
1

はい、dsサンプルの最後のエンドブラケットに配置されます。はい、ds作成時に利用できますdt。理由dtは、null単にds.Tables[0]nullを返しているということであるに違いありません。ドキュメントから、null値はDataTableあなたが探しているものが存在しないことを意味します。私の推測では、DataSetは値で満たされていません。については、ドキュメントを参照してください。

于 2012-04-27T20:32:03.090 に答える
0

using()ステートメントはanyを受け取り、そのスコープが例外または通常の実行によって終了したときにそれIDisposableを呼び出します。Dispose()

したがってdt、最初に内側のクロージングを通過したときに廃棄され}、次にds外側のクロージング'}`を通過したときに廃棄されます。

using(DataSet ds = GetDataSet()) 
{
    using(DataTable dt = ds.Tables[0]) 
    {
        ....
    } // <-- dt disposed here or if unhandled exception thrown

} // <-- ds disposed here or if unhandled exception thrown.

詳細については、UsingステートメントのMSDNセクションを参照してください。

于 2012-04-27T20:29:39.103 に答える
0

はい、対応するブラケットから離れた後に廃棄されます。呼び出しの使用はdisposeであり、IDisposableを実装するオブジェクトでのみ使用できます。

于 2012-04-27T20:30:15.653 に答える
0

ここでの使用ステートメント

using (ResourceType resource = expression) { ... }

と同等です:

ResourceType resource = expression;
try {
    ...
}
finally {
   if (resource != null) ((IDisposable)resource).Dispose();
}

ResourceTypeが値型の場合、nullチェックは省略されます)。

したがって、あなたの場合、最初に使用することGetDataSet()は、他の誰も後で使用しない新しいデータセットを作成すると仮定して意味があります。2つ目usingはあまり意味がありません。私が知る限り、データセットテーブルを破棄する必要はありません。

nullが発生する理由は、コレクションdtに何もないことが原因である可能性があります。Tables

于 2012-04-27T20:30:48.657 に答える
0

このように考える:

using resource

あなたresourceはここに住み、ステートメントまたは他の方法を「使用する」他のすべての子供たちが利用できるようになります

end of using

だからあなたの質問に:

dsusing最初のブロックの終わりに処分されます

dt最初にDataTable見つかったものを取得し、それ自体のブロックdsの最後に配置されますusing

これはusing、この形式のステートメントが常にDispose管理しているリソースのメソッドを呼び出すために発生します。したがって、usingブロックを使用できるのは、実装するタイプのタイプのみです。IDisposable

于 2012-04-27T20:31:35.857 に答える