Я смотрел какой-то код и обсуждал его с коллегами.
В частности, раздел кода, который выглядит следующим образом.
[Test]
public void TestNormalWay()
{
using(var cn = GetConnection())
{
cn.Open();
// do stuff
}
}
Возник вопрос:
"почему бы не переместить cn.Open в метод GetConnection."
Я сказал, что если "Открыть" выбрасывает исключение, вызов не будет вызван. Его ответ был
"Так что. Соединение не было открыто, так зачем ему нужно закрыто (или расположено)?"
Для меня это просто вопрос не желая знать, нужно ли мне или нет, чтобы я захотел распорядиться/закрыть, поэтому я бы повторил cn.Open в коде вместо того, чтобы переместить его в общую функцию.
НО, это интересно... поэтому я немного читал в Пул соединений SQL Server (ADO.NET)
Мне непонятно, существует ли сценарий, в котором вызывается cn.Open и он выдает и исключение, где dispose нужно будет вызывать.
Итак, в моем примере ниже есть какая-то разница между "TestNormalWay" и "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
}
}