Какой лучше в структуре?
class Program
{
static void Main(string[] args)
{
try
{
using (Foo f = new Foo())
{
//some commands that potentially produce exceptions.
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
или...
class Program
{
static void Main(string[] args)
{
using (Foo f = new Foo())
{
try
{
//some commands that potentially produce exceptions.
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
Я не думаю, что это имеет большое значение с точки зрения производительности. Однако есть небольшая разница: во втором примере f
все еще доступен внутри обработчика исключений, в то время как в первом он вышел за пределы области видимости. И наоборот, в первом примере исключения в конструкторе Foo
, а также в его методе Dispose
будут пойманы, а во втором - нет.
И то, и другое может быть или не быть тем, что вам нужно.
Использование только
Foo f = null;
try
{
f = new Foo();
}
finally
{
if (f is IDisposable)
f.Dispose();
}
Видно, что вы можете добиться перехвата исключений следующим образом:
Foo f = null;
try
{
f = new Foo();
}
catch (Exception ex)
{
// handle exception
}
finally
{
if (f is IDisposable)
f.Dispose();
}
Первый вариант лучше. Если возникнет исключение, оно будет поймано.
try
{
using (Foo f = new Foo())
{
//some commands that potentially produce exceptions.
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Концепция using заключается в том, что он утилизирует объект, созданный в using, т.е. автоматически вызывает метод IDispose. На основании требований используйте using.
Любой вариант подходит, в зависимости от того, что вы собираетесь делать в улове. Если вам нужно использовать f
в вашем catch, тогда он должен быть в операторе using. Однако в вашем примере разницы нет.
РЕДАКТИРОВАТЬ:
Как указано в другом месте, это также зависит от того, пытаетесь ли вы перехватить только исключения, сгенерированные в блоке после использования, или включение создания объекта в оператор using. Если он находится в блоке после использования, то это так, как я описал. Если вы хотите перехватывать исключения, генерируемые Foo f = new Foo ()
, вам необходимо использовать первый метод.
Проверьте этот пост, чтобы лучше понять: http://www.ruchitsurati.net/index.php/2010/07/28/understanding-%E2%80%98using%E2% 80% 99-block-in-c /
Также прочтите ответы на этот вопрос: Перехват исключений, созданных в конструкторе целевого объекта блока Using
, первый лучше
class Program
{
static void Main(string[] args)
{
try
{
using (Foo f = new Foo())
{
//some commands that potentially produce exceptions.
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
, потому что если вы видите, что код IL этого блока try and catch не завершает инициализацию объекта.
Первый вариант лучше, поскольку он перехватывает любые исключения, возникающие в процессе удаления. Конечно, вы не должны создавать никаких исключений при утилизации, но всякое бывает.