...
SqlDataReader dataReader = null;
try
{
dataReader = dbCommand.ExecuteReader();
...
dataReader.Close();
}
catch (SomeException ex)
{
if (dataReader is object)
dataReader.Close();
...
}
...
Исключения и высвобождение ресурсов
Есть некоторый метод и в нем используется, допустим, SqlDataReader и примерно такой код:
Код:
Вопрос. Как лучше переделать: через try-finally, чтобы закрывать dataReader или с использованием using (dataReader = dbCommand.ExecuteReader()) {} или вообще не принципиально и может быть оставить так как есть? Просто я не так уж и давно пишу на C# и все тонкости могу и не знать.
И еще вопрос. Когда я использую using, то если вываливается исключение, то dataReader будет закрыт, т.е. Dispose() для него сработает?
Код:
SqlDataReader dataReader = null;
try
{
dataReader = dbCommand.ExecuteReader();
...
}
catch( ... ex )
{
...
}
finally
{
if (dataReader != null)
dataReader.Close();
}
try
{
dataReader = dbCommand.ExecuteReader();
...
}
catch( ... ex )
{
...
}
finally
{
if (dataReader != null)
dataReader.Close();
}
Когда используется using, гарантируется, что будет вызван метод Dispose(). Фактически компилятор превращает в блок try { ... } finally { ... }.
Для закрытия SqlDataReader'а следует использовать метод Close(), а для проверки на null:
Код:
if (dataReader != null)
а не
Код:
if (dataReader is object)
(если именно это имелось ввиду в этой строчке).
Спасибо, всё подтвердилось. А насчет "is object" - это абсолютно то же самое что "!= null", просто мне так больше нравится :)
сорцы того, что делал. Может понадобится кому-нибудь.
Выложил