Estaba buscando un código y discutiéndolo con mis compañeros de trabajo.usando una declaración con connection.open
Específicamente una sección de código que se ve así.
[Test]
public void TestNormalWay()
{
using(var cn = GetConnection())
{
cn.Open();
// do stuff
}
}
surgió la pregunta:
"por qué no mover el cn.Open en el método getConnection."
Dije que si "Abrir" arroja una excepción, no se deshabilitaría. Su respuesta fue
"¿Y qué? La conexión no se abrió entonces ¿por qué tendría que cerrarse (o desecharse) ?"
para mí es sólo una cuestión de no querer saber si o si no lo requiere desechar/cierre así que repetir el cn.Open en el código en lugar de moverlo a la función compartida.
PERO es interesante ... Así que hice una lectura en SQL Server Connection Pooling (ADO.NET)
Para mí no está claro si existe un escenario en el que llamar cn.Open y se lanza una excepción y en disponer lo haría necesita ser llamado.
Así que en mi siguiente ejemplo ¿Hay alguna diferencia realmente entre "TestNormalWay" y "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
}
}
por lo que dices ... y lo que estoy viendo es la única forma en que Dispose se invocará en el método WhyNotDoItTHisWay. Solo porque llame a Open no descarta automáticamente la conexión si tiene sentido. . envolviendo la var cn alrededor de using() {} el cn se elimina automáticamente asumiendo que usted también ha actualizado esa instancia .. – MethodMan
Si está usando una declaración ** using ** no debería tener que deshacerse de el objeto mismo. Como sus compañeros de trabajo sospechan que ocurre una excepción al intentar abrir la conexión, el objeto no contiene información para deshacerse de ella. Además, como sugiere Servy, simplemente puedes usar un bloque try() catch() finally() si realmente quieres estar seguro. –