2

重複の可能性:
「using」ステートメントをよりよく理解しようとする

私は本当に他のすべての投稿を読みましたが、誰も私の質問に本当に答えません.

これはテーブルを返す私の関数です

        public DataTable ReturnTable()
        {
            DataTable dt = new DataTable();   
            using (SqlConnection con = new SqlConnection(mainConnectionString))
            {
                con.Open();                             
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.CommandType = CommandType.Text;    
                    SQL = " SELECT * from table";                        
                    cmd.CommandText = SQL;                                            
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        da.Fill(dt);
                    }
                }
            }           
            return dt;
        }

以下に対する前の利点は何ですか(「使用」を発見する前に私が常に使用していたもの):

public DataTable ReturnTable()
            {
                DataTable dt = new DataTable();   
                SqlConnection con = new SqlConnection(mainConnectionString);
                con.Open();                             
                SqlCommand cmd = new SqlCommand();
                cmd.CommandType = CommandType.Text;    
                SQL = " SELECT * from table";                        
                cmd.CommandText = SQL;                                            
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
                con.Close();
                return dt;
            }

2つ目ですが、con、cmd、daが適切に配置されていませんか? 2番目に何か問題がありますか?

ありがとう!

4

4 に答える 4

4

2番目に何か問題がありますか?

コードで例外が発生しない限り、とがこの場合実質的に同じであるためcon、これは についても同じように機能します。すぐに破棄することはなく、リソースを解放するためにガベージ コレクションが行われるまで待機します。Close()Dispose()dacmd

の利点はusing、例外が発生した場合やメソッドを早期に終了した場合でもリソースが破棄されることです (メソッドreturnの途中で a を追加します)。

于 2012-12-14T23:29:22.617 に答える
0

この場合の「使用」は、RAIIパターンの実装を試みます。これは、データベース接続などの限られたリソースを扱う場合に特に役立ちます。

于 2012-12-15T03:52:44.703 に答える
0

利点は、usingパターンがインターフェイスでDispose()メソッドを呼び出し、例外がスローされた場合でも、見逃した可能性IDisposableのあるクリーンアップ ロジックが適切に実行されることを保証することです。

実際には、実装するオブジェクトは、呼び出されたときにクリーンアップされるアンマネージIDisposableリソースを保持しています。そのため、電話をかけるだけでは不十分な場合があります。Dispose()Close()

于 2012-12-14T23:28:57.267 に答える
0

いいえ、それらは同じではありませ。それが の要点ですusing

コードが例外をスローするとどうなりますか? これらのオブジェクトは、ガベージ コレクターがたまたまそれに近づくまで破棄されません。

于 2012-12-14T23:29:27.903 に答える