Попытка состоит в том, чтобы Наконец использоваться используемая экономно по тем же причинам как Выгода Попытки?

Взгляните на модуль Hanging_threads (доступный в PyPI) - он может дать вам несколько советов о том, где застрял ваш код Однако он склонен к ложным срабатываниям (например, если ваш сценарий ожидает сетевого подключения).

11
задан Community 23 May 2017 в 11:49
поделиться

6 ответов

Вы не должны избегать попытки {}... наконец {} шаблон кодирования. Но насколько Ваши соединения идут, так как они - IDisposable, используйте "использование" вместо этого, так как это делает то же самое для Вас как дольше и больше громоздкого блока попытки/наконец.

19
ответ дан 3 December 2019 в 03:54
поделиться

Используйте Попытку/Наконец, где она имеет смысл, не пытайтесь оптимизировать это, пока Вам на самом деле не вызвало проблему это.

Однако Попытка/Наконец не является столь же дорогой как исключения. Несомненно, они не свободны, но бросок, и ловля исключения является более дорогой, чем блок Попытки/Наконец.

"Деструктор" в.NET называют, когда объект собирается "мусор", что означает, что может требоваться много времени, прежде чем это назовут. Используйте Расположить шаблон для реализации детерминированного распоряжения ресурса.

2
ответ дан 3 December 2019 в 03:54
поделиться

Плохая вещь об использовании блока try-catch везде состоит в том, что в потреблении исключения Вы потенциально скрываете плохой код. Попробуйте наконец (без выгоды), не скрывает исключения, но действительно обеспечивает гарантии выполнения кода. В Вашем случае можно ожидать определенные типы исключений даже из хорошо сформированных команд SQL (как попытка вставить дублирующуюся строку), и таким образом я думаю, что использование наконец хорошо выравнивается по ширине. Это предполагает, что Вы чувствуете, как я делаю, что соединения должны быть недолгими и открылись/закрыли при использовании а не для жизни DAL.

Править: Я был бы рекомендация второго @Dave Маркли. Блок использования намного более изящен и семантически эквивалентен. Единственное время я мог бы одобрить попытку наконец по использованию, должно избежать нескольких, вложенные использования за единственная попытка наконец.

3
ответ дан 3 December 2019 в 03:54
поделиться

Я полагаю, что это - намного лучшая практика для обертывания соединения в оператор использования (предполагающий, что соединение реализует IDisposable). Расположить метод проверит состояние Вашего соединения и близко при необходимости.

1
ответ дан 3 December 2019 в 03:54
поделиться

Деструктор C# называют, когда объект собран "мусор", кроме нескольких случаев границы (если приложение закрывается, поток финализатора только становится таким длинным, после которого это только что завершается). Но это означает, что Вы не знаете, когда это назовут. Это может быть долгое время, прежде чем объект будет собран "мусор". Таким образом, Вы правы, это - плохая идея.

Однако попытка/наконец обычно бессмысленна также, потому что a using блок достигнет того же самого более изящно.

1
ответ дан 3 December 2019 в 03:54
поделиться

Как другие указали, попытка наконец редко необходима из-за наличия конструкции использования в C#. Я все еще полагаю, что модель является шагом назад от RAII в C++ - причина, являющаяся, который нагрузка во все еще на клиенте кодирует, чтобы не забыть использовать использование (так же, как они должны были бы не забыть использовать попытку наконец). И в то время как использование более сжато, чем попытка наконец, все еще кажется излишне подробным, если Вы привыкли к C++, особенно когда Вы получаете несколько уровней вложения.

Я записал запись в блоге о том, как смягчить это несколько некоторое время назад:

http://www.levelofindirection.com/journal/2009/9/24/raii-and-readability-in-c.html

0
ответ дан 3 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: