При выполнении работы IO I код ожидать исключение.
SqlConnection conn = null;
SqlCommand cmd = null;
try
{
conn = new SqlConnection(Settings.Default.qlsdat_extensionsConnectionString)
cmd = new SqlCommand(reportDataSource, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Year", SqlDbType.Char, 4).Value = year;
cmd.Parameters.Add("@startDate", SqlDbType.DateTime).Value = start;
cmd.Parameters.Add("@endDate", SqlDbType.DateTime).Value = end;
conn.Open(); //opens connection
DataSet dset = new DataSet();
new SqlDataAdapter(cmd).Fill(dset);
this.gridDataSource.DataSource = dset.Tables[0];
}
catch(Exception ex)
{
Logger.Log(ex);
throw;
}
finally
{
if(conn != null)
conn.Dispose();
if(cmd != null)
cmd.Dispose();
}
Edit: Чтобы быть явным, я избежать с помощью блока здесь, потому что я считаю, что это важно, чтобы войти подобных ситуациях. Опыт научил меня, что вы никогда не знаете, какое странное исключение может появиться. Вход в эту ситуацию может помочь вам обнаружить тупик или найти, где изменение схемы влияет на малоиспользуемую и мало проверенную часть вашей базы кода или на любое количество других проблем.
Редакция 2: Можно утверждать, что используемый блок может обернуть try/catch в этой ситуации, и это полностью действительный и функционально эквивалентный. Это действительно сводится к предпочтению. Вы хотите избежать дополнительного гнездования за счет обработки вашего собственного распоряжения? Или вы несете дополнительное гнездование для автоматического удаления. Я чувствую, что первый чище, поэтому я так делаю. Однако я не переписываю последнее, если найду его в базе кода, в которой я работаю.
Редактировать 3: Я действительно очень хочу, чтобы MS создала более явную версию использования(), которая сделала его более интуитивно понятным, что на самом деле происходило и в этом случае было больше гибкости. Рассмотрим следующую, воображаемую код:
SqlConnection conn = null;
SqlCommand cmd = null;
using(conn = new SqlConnection(Settings.Default.qlsdat_extensionsConnectionString),
cmd = new SqlCommand(reportDataSource, conn)
{
conn = new SqlConnection(Settings.Default.qlsdat_extensionsConnectionString);
cmd = new SqlCommand(reportDataSource, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Year", SqlDbType.Char, 4).Value = year;
cmd.Parameters.Add("@startDate", SqlDbType.DateTime).Value = start;
cmd.Parameters.Add("@endDate", SqlDbType.DateTime).Value = end;
cmd.Open();
DataSet dset = new DataSet();
new SqlDataAdapter(cmd).Fill(dset);
this.gridDataSource.DataSource = dset.Tables[0];
}
catch(Exception ex)
{
Logger.Log(ex);
throw;
}
А, используя оператор создает только попытка/наконец Dispose() вызывает в конце концов. Почему бы не дать разработчику единый способ удаления и обработки исключений?
Я вижу, что вы говорите, но я не вижу преимущества над блоком try catch, заключая с закрытыми и распоряжающимися утверждениями. – PeteT 2008-10-30 01:05:45
Ресурсы не могут находиться вне вида сборщика мусора. По-прежнему полезно очищать их как можно скорее, а не ждать GC. – 2010-03-24 22:38:37
дело не в сборщике мусора. – 2010-08-12 19:20:47