Самый легкий способ понять его к динамическому программированию Google.
Это - алгоритм, это было одолжено от Информационного поиска и используется в большой степени в современной дневной биоинформатике, чтобы видеть, как similiar две последовательности генов.
Оптимальное решение использует динамическое программирование и рекурсию.
Это - очень решенная проблема с большим количеством решений. Просто Google вокруг, пока Вы не находите некоторый открытый исходный код.
Оператор using
должен использоваться каждый раз, когда вы создаете экземпляр класса, который реализует IDisposable
в рамках блока . Это гарантирует, что метод Dispose ()
будет вызываться в этом экземпляре, независимо от того, выбрано ли исключение.
В частности, ваш код перехватывает только управляемые исключения, а затем уничтожает фрейм стека, бросая новое исключение вместо повторного создания существующего.
Правильный способ сделать это:
using (SqlConnection cn = new SqlConnection(ConfigurationManager.AppSettings["T3"])) {
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction()) {
//some code
tr.Commit();
}
}
Обратите внимание, что если в вашем классе есть члены экземпляров типов, реализующих IDisposable
, тогда ваш класс должен реализовать ] IDisposable
и удалите эти элементы во время собственного вызова Dispose ()
.
По сути, using делает то же самое, что и вы, за исключением блока int a finally вместо перехвата всех исключений:
using (SqlConnection cn = new SqlConnection())
{
using (SqlTransaction tr = cn.BeginTransaction())
{
//some code
tr.Commit();
}
}
то же самое, только гораздо меньше кода :)
{
SqlConnection cn = null;
try
{
cn = new SqlConnection();
{
SqlTransaction tr = null;
try
{
tr = cn.BeginTransaction())
//some code
tr.Commit();
}
finally
{
if(tr != null && tr is IDisposable)
{
tr.Dispose();
}
}
}
}
finally
{
if(cn != null && cn is IDisposable)
{
cn.Dispose();
}
}
}
Причина этого в том, что объект SqlTransaction откатится в своем методе Dispose (), если он не был зафиксирован явно (например, если возникло исключение). Другими словами, он имеет тот же эффект, что и ваш код, только немного чище.
В конце концов, с использованием
- это просто ярлык для шаблона. Но это очень полезный и полезный ярлык, потому что он гарантирует, что вы правильно реализуете шаблон, и означает, что вы можете сделать это с меньшим количеством кода.
В этом случае вы неправильно реализовали шаблон. Что произойдет в вашем коде, если вызов tr.RollBack ()
также вызовет исключение?
Оператор using закрывает и удаляет ваше соединение и транзакцию за вас. Это эквивалентно блоку finally в вашем try / catch, который выполняет удаление.
Вы также можете сжать блоки using примерно так ...
using (SqlConnection cn = new SqlConnection())
using (SqlTransaction tr = cn.BeginTransaction())
{
//some code
tr.Commit();
}
, что будет примерно таким же, как:
SqlConnection cn = null;
SqlTransaction tr = null;
try
{
cn = new SqlConnection());
tr = cn.BeginTransaction());
//some code
tr.Commit();
}
finally
{
if (cn != null)
cn.Dispose();
if (tr != null)
tr.Dispose();
}
Если вы не используете блок using (), вам придется явно вызвать метод .Dispose () объектов SqlConnection и SqlTransaction. Если вы этого не сделаете, то неуправляемые ресурсы не будут освобождены и могут вызвать утечку памяти или другие проблемы.
Оператор Using - это сокращение для правильной обработки ресурса. Дополнительную информацию можно найти в статье MSDN об использовании оператора
Использование гарантирует, что ваш объект подключения будет удален после возврата кода. Dispose полезен для освобождения неуправляемых ресурсов. В качестве хорошей практики, если объект реализует IDisposable, всегда следует вызывать метод dispose