Zgodnie z moim innym pytaniem dotyczącym obiektów jednorazowego użytku , czy powinniśmy wywołać Close () przed końcem using bloku?
using (SqlConnection connection = new SqlConnection())
using (SqlCommand command = new SqlCommand())
{
command.CommandText = "INSERT INTO YourMom (Amount) VALUES (1)";
command.CommandType = System.Data.CommandType.Text;
connection.Open();
command.ExecuteNonQuery();
// Is this call necessary?
connection.Close();
}
c#
asp.net
using
sqlconnection
sqlcommand
John Bubriski
źródło
źródło
Demontaż SqlConnection przy użyciu .NET Reflector :
Wywołuje Close () wewnątrz Dispose ()
źródło
Słowo kluczowe using spowoduje prawidłowe zamknięcie połączenia, więc dodatkowe wywołanie Close nie jest wymagane.
Z artykułu MSDN na temat puli połączeń programu SQL Server :
Rzeczywista implementacja SqlConnection.Dispose przy użyciu .NET Reflector jest następująca:
źródło
Używając Reflectora , możesz zobaczyć, że
Dispose
metodaSqlConnection
faktycznie wywołujeClose()
;źródło
Nie, wywołanie metody Dispose () w SqlConnection również wywołuje Close ().
MSDN - SqlConnection.Dispose ()
źródło
Nie, blok Using
Dispose()
i tak dzwoni , więc nie ma potrzeby dzwonićClose()
.źródło
Dispose()
rozmowyClose()
, a nie odwrotnie?Nie, nie jest konieczne zamykanie połączenia przed wywołaniem funkcji Dispose.
Niektóre obiekty (takie jak SQLConnections) mogą być ponownie użyte po wywołaniu Close, ale nie po wywołaniu Dispose. W przypadku innych obiektów wywołanie Close jest takie samo, jak wywołanie Dispose. (Myślę, że ManualResetEvent i strumienie zachowują się w ten sposób)
źródło
Nie, klasa SqlConnection dziedziczy po IDisposable, a po napotkaniu końca using (dla obiektu połączenia) automatycznie wywołuje Dispose w klasie SqlConnection.
źródło