Должен ли я использовать try {} или используя () в C #? - PullRequest
3 голосов
/ 22 апреля 2009

Я новичок в C #, я любил паскаль, пока не нашел C # в Depth. В Delphi есть оператор try {}, который также реализован в C #.

Однако я видел, как некоторые из вас упоминали, что «Использование () {} лучше, чем попытка {}».

Вот пример:

   //This might throw an exception
   sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
   sock.Connect(ip, port);

   //Try statement
   try
   {
       sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
       sock.Connect(ip, port);
   catch
   {
   }

   //using(){}
   using(sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
   {
          sock.Connect(ip, port);
   }

Мои вопросы:

  1. Что произойдет, если произойдет исключение внутри оператора "using"?

  2. Когда я должен использовать «использование» вместо «попробовать» а когда "попробуй" над "используя"?

  3. Какова цель "использования" утверждение?

Заранее спасибо!

Ответы [ 7 ]

10 голосов
/ 22 апреля 2009

Использование и попытка - это 2 очень разные вещи, и они полностью ортогональны.

Если исключение возникает и не находится в блоке try, стек разворачивается до тех пор, пока не будет найден соответствующий обработчик исключения. Это независимо от оператора использования.

Используйте using {}, если хотите убедиться, что объект правильно приведен в порядок после использования - в вашем примере носок будет правильно утилизирован после использования блока.

Для получения дополнительной информации об использовании using seach в Интернете (или SO) для "IDisposable".

7 голосов
/ 22 апреля 2009

Оператор using используется, когда вы создаете (и используете) новый объект, который реализует IDisposable. Операторы using всегда избавляются от объекта, даже если исключение вызывается в блоке using.

операторы try / catch обычно служат совершенно другой цели, но блок finally в видах try / catch / finally или try / finally служит той же цели, поскольку выполняется безоговорочно. Использование статистики покупает вам автоматический вызов для удаления.

Я рекомендую статью Дэвида Хейдена: Обзор кода C # - Использование оператора C # - Попробуйте / наконец - IDisposable - Dispose () - SqlConnection - SqlCommand

Статья MSDN об использовании оператора
MSDN статья о Try / Catch / Наконец

4 голосов
/ 22 апреля 2009

using полностью отличается от try / catch. Блок using используется для обеспечения утилизации IDisposable, что означает, что вызывается Dispose(). Попробуй, поймай и наконец обработай исключение. Блок using похож на:

IDisposable d; try { d = m; } finally { d.Dispose(); }

Разница между этим и using является областью действия переменной, потому что с using она создается внутри блока.

m является заполнителем для любого объекта строительства. Для получения дополнительной информации см. MSDN в using, IDisposable. Особенно стоит прочитать информацию об утилизации, сборке мусора и неуправляемых ресурсах.

3 голосов
/ 22 апреля 2009

Использование операторов гарантирует, что IDisposable удаляется после его использования.

Исключение используется для отлова исключений, которые вы не можете учесть.

Так что они на самом деле не подлежат обмену.

2 голосов
/ 22 апреля 2009

Речь идет не о попытке, а о попытке / наконец и / или попытке / catch . И у них совершенно разные цели.

с использованием немного более короткой и дружественной записи для try{}finally{ Dispose() } и поэтому предпочтительнее.

1 голос
/ 22 апреля 2009

using - это просто попытка {} finally {} с последующим вызовом метода dispose () для чего-то, реализующего IDispose. Так что в качестве хорошего практического правила, если объект поддерживает IDispose ... используйте использование {}

0 голосов
/ 22 апреля 2009

Try-блоки предназначены для блоков кода, которые могут содержать непредвиденные события (сбой баз данных, сбой соединений и т. Д.), И их следует использовать только для этого. Быть готовым к отлову исключений довольно ресурсоемко, и если вы можете ограничить использование блоков try-catch, тем лучше. Тем не менее, они являются очень мощным инструментом для защитного программирования, и потеря производительности определенно стоит того, так как вы можете собрать много информации и статистики по вашим проблемам из журналов исключений.

Блоки использования используются для узкой области видимости переменных и полезны для таких вещей, как объекты с большой памятью, которые вам не нужны в течение действительно короткого периода времени. Это в основном сообщение для среды выполнения, что «после этого блока избавьтесь от объекта».

...