1

だから私は前のコーダーが多くの面白いことをした既存のプロジェクトを引き継いでいます。

私が最もよく見て、実際には理解していないのは、次のコードブロックです

finally
{
   if (conn != null)
   {
       conn.Close();
       ds.Dispose();
   }
}
return ds;

VS2010は文句を言っておらず、プロジェクトは意図したとおりに機能しますが、これは私にとっては奇妙なことです。

どうすれば廃棄して返却できますか?どういうわけか帰国後、ようやく行われない限り!

誰かがこれが合法である理由を説明できれば?または他の説明をいただければ幸いです。

4

4 に答える 4

3

dsデータセット内の情報が失われるため、再取得する前に破棄するの は正しくありませんmethodfinallyブロックで接続を破棄することは完全に問題ないように見えますが、メソッドの呼び出しにまだ戻されなければならないデータセットdsではありません。

于 2012-07-03T10:18:39.047 に答える
1

オブジェクトが不要になったら、.Dispose()オブジェクトを使用することになっています。明らかに、この例でデータセットを破棄した後にDataSetが必要になるため、ここで絶対に破棄しないでください。

DataSetの.Dispose()は実際には何もしない可能性があるため、コードは機能しているように見えます。.Dispose()は、ガベージコレクターが実行できないリソースの使用を終了して終了すること、またはガベージコレクターが起動したときではなく、そのようなリソースをすぐに破棄することを目的としています。ただし、.Dispose()に依存しないでください。 DataSetで何も実行しない-何かを実行する状況が発生する可能性があります。コードを修正します。

于 2012-07-03T10:23:26.107 に答える
0

そのように、dsは戻ったときに破棄されているように見えますが、コードを実行するとエラーが発生しますか?その場合、そのコードをリファクタリングし、//ds.Disposeにコメントします

于 2012-07-03T10:19:10.650 に答える
0

Dispose()関数を呼び出すと、オブジェクトにガベージコレクションのフラグを立てるだけで、オブジェクトをすぐに「解放/破棄」することはありません。これが、コードが機能している理由です。そのロジックが意味をなさない場合は、いつでも次のようなことを行うことができます。

try{
    // ... your code
    return ds;
}
catch(Exception x)
{
    // ...  Exception code
}
finally
{
   if (conn != null)
   {
       conn.Close();
       ds.Dispose();
   }
}
于 2013-08-28T18:03:28.677 に答える