Никогда не говори никогда. Часть1

Сможете ли вы придумать лямбда-выражение, неявно приводимое к функции Func<T> для любых возможных T? . . . . . . . . . . . Подсказка: это же лямбда-выражение также неявно приводится к типу Action. . . . . . . . . . Func<int> function = () => { throw new Exception(); }; Правила…

1

Асинхронность в C#. Часть 8: опять исключения

(В этом сообщении я буду говорить о внутренних, неприятных, дурных и критических исключениях. Для разъяснения этих терминов, загляните сюда.) Если в вашем процессе происходит необработанное исключение, то явно произошло что-то плохое и непредвиденное. Если это критическое исключение, то шансов спасти процесс у вас уже нет – с ним уже все кончено. Вы можете так и…

0

Асинхронность в C# 5. Часть 7: исключения

Давайте продолжим с того места, где мы остановились (ха-ха-ха!) после небольшого отступления: обработка исключений в таких «возобновляемых» методах, подобных нашим асинхронным методам, кажется немного странной. Чтобы понять, насколько это странно, вам может понадобиться освежить в памяти мою последнюю серию статей о проектировании блоков итераторов, и в особенности сообщение о разнице между push и pull-моделями. В…

0

Перебор с повторным использованием

Недавно один пользователь задал такой вопрос: У меня есть код, который обслуживает очередь рабочих элементов, ожидающих обработки несколькими рабочими потоками. В некоторых ситуациях, вследствие катастрофических ошибок, я завершаю обработку элементов путем генерации исключения. Могу ли я создать всего лишь один объект исключения? Существуют ли какие-то проблемы при генерации того же самого объекта исключения несколько раз…


Безвременно как бесконечность

Пользователь: Недавно я обнаружил в C# странное поведение относительно деления на ноль чисел с плавающей запятой. Оно не бросает исключение, как целочисленное деление, а возвращает «бесконечность». С чего бы это? Эрик: Как я частенько говорил, мне трудно отвечать на вопросы «почему». Обычно моя первая попытка ответить на вопрос «почему» – «потому, что так гласит спецификация»;…


Блоки итераторов, часть пятая: Активный или Пассивный

Некоторое время назад я опубликовал комментарий по поводу Летних Игр по Скриптингу, где я отметил наличие изоморфизма между «пассивными» коллекциями, , и «активными» событиями. Обычно вы думаете про события, как про что-то, что «вызывает» вас, отдавая вам аргументы событий. А о коллекциях вы думаете как о чём-то таком, из чего вы «вытаскиваете» данные, запрашивая следующее…


Блоки итераторов, Часть четвёртая: Почему нет yield в блоках catch?

Теперь, когда вы знаете, почему мы не разрешаем yield в finally, легко увидеть, почему мы также запрещаем yield в catch. Во-первых, у нас всё еще есть проблема – запрещено делать goto в середину обработчика региона, защищённого try. Единственный способ войти в блок catch – это «нелокальный переход», то есть отлов исключения. Так что, стоило вам…


Блоки итераторов, Часть третья: почему нет yield в блоке finally?

Есть три сценария, в которых код блока итератора может исполняться в finally. Ни в одном из них возврат значения изнутри finally не является хорошей идеей, так что это полностью запрещено. Эти три сценария – (1) обычная очистка ресурсов, (2) очистка ресурсов при возникновении исключения, и (3) разрушение итератора. Для первого сценария, предположим, что у нас…