При выполнении операций ввода-вывода я кодирую ожидаю исключения.
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();
}
Редактировать: Если говорить прямо, я избегаю здесь с использованием блока , потому что считаю важным входить в такие ситуации. Опыт научил меня, что вы никогда не знаете, какое странное исключение может появиться. Ведение журнала в этой ситуации может помочь вам обнаружить тупик или определить, где изменение схемы влияет на малоиспользуемую и мало проверенную часть вашей кодовой базы или на любое количество других проблем.
Редактировать 2: Можно утверждать, что блок использования может обернуть попытку / поймать в этой ситуации, и это полностью допустимо и функционально эквивалентно. Это действительно сводится к предпочтениям. Вы хотите избежать лишних вложений за счет обработки вашего собственного захоронения? Или вы берете на себя дополнительное вложение, чтобы иметь автоматическое удаление. Я чувствую, что первое чище, поэтому я делаю это таким образом. Однако я не переписываю последнее, если найду его в кодовой базе, в которой я работаю.
Редактировать 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;
}
Оператор using просто создает try / finally с вызовами Dispose () в finally. Почему бы не дать разработчику унифицированный способ удаления и обработки исключений?