Stavo guardando un po 'di codice e discuto con i colleghi di lavoro.using statement with connection.open
In particolare una sezione di codice simile a questa.
[Test]
public void TestNormalWay()
{
using(var cn = GetConnection())
{
cn.Open();
// do stuff
}
}
La domanda si avvicinò:
"Perché non spostare il cn.Open nel metodo GetConnection."
Ho detto che se "Apri" genera un'eccezione, non viene chiamata. La sua risposta è stata
"Allora, la connessione non è stata aperta, quindi perché sarebbe necessario ottenere chiuso (o smaltito)?"
per me è solo una questione di non voler sapere se o se non ho bisogno di smaltire/chiudere quindi vorrei ripetere il cn.Open nel codice invece di spostarlo nella funzione condivisa.
MA è interessante ... così ho fatto qualche lettura SQL Server Connection Pooling (ADO.NET)
Per me non è chiaro se esiste uno scenario in cui chiamare cn.Open e getta e l'eccezione in cui dispose sarebbe bisogno di essere chiamato.
Così, nel mio esempio qui sotto v'è alcuna differenza davvero tra "TestNormalWay" e "WhyNotDoItThisWay"
protected static DbConnection GetConnection()
{
DbConnection cn = new SqlConnection("SomeConnecitonstring... ");
return cn;
}
protected static DbConnection GetConnectionDangerousVersion()
{
DbConnection cn = new SqlConnection("SomeConnecitonstring... ");
cn.Open(); // this will throw.. .dispose not called
return cn;
}
[Test]
public void TestNormalWay()
{
using(var cn = GetConnection())
{
cn.Open();
// do stuff
}
}
[Test]
public void WhyNotDoItThisWay()
{
using(var cn = GetConnectionDangerousVersion())
{
// do stuff
}
}
così basato su quello che stai dicendo .. e quello che sto guardando l'unico modo in cui Dispose verrà chiamato nel metodo WhyNotDoItTHisWay .. solo perché tu chiami Open non si disfa automaticamente della connessione ha senso. .includendo il var cn attorno all'utilizzo() {} il cn viene eliminato automaticamente assumendo anche che si riattiva anche quell'istanza .. – MethodMan
Se si sta usando un ** usando ** l'istruzione non si deve dovere disfarsi di l'oggetto te stesso. Come i tuoi colleghi di lavoro sospettano se si verifichi un'eccezione quando si tenta di aprire la connessione, l'oggetto non contiene alcuna informazione da smaltire. Inoltre, come suggerito da Servy, potresti semplicemente usare un blocco try() catch() finally() se vuoi davvero essere sicuro. –