Распространяется ли checked на арифметику внутри вызванного метода?
Ответ: Нет. Контекст checked действует на операции, записанные внутри него, и не переносится через вызов в тело другого метода.
Допустим, метод AddOne(int x) возвращает x + 1. Если обернуть вызов AddOne(int.MaxValue) в checked, это само по себе не заставит сложение внутри AddOne выбросить OverflowException.
Поведение сложения определяется контекстом в самом методе и настройками проверки переполнения при его компиляции. Чтобы явно проверять эту операцию, нужно написать checked(x + 1) в AddOne.
Поэтому без знания настроек компиляции нельзя уверенно обещать конкретный результат исходного примера. Важный принцип: checked не включает проверку во всём стеке вызовов.
Подробнее в документации Microsoft Learn
🐸 Библиотека собеса по C#
Допустим, метод AddOne(int x) возвращает x + 1. Если обернуть вызов AddOne(int.MaxValue) в checked, это само по себе не заставит сложение внутри AddOne выбросить OverflowException.
Поведение сложения определяется контекстом в самом методе и настройками проверки переполнения при его компиляции. Чтобы явно проверять эту операцию, нужно написать checked(x + 1) в AddOne.
Поэтому без знания настроек компиляции нельзя уверенно обещать конкретный результат исходного примера. Важный принцип: checked не включает проверку во всём стеке вызовов.
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
The checked and unchecked statements - overflow-checking - C# reference
Control the overflow-checking context. In a checked context, overflow causes an exception to be thrown. In an unchecked context, the result is truncated.
🤔1
В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.
Например, можно совместить два направления по работе с ИИ:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога.
Акция действует до 31 октября включительно
Please open Telegram to view this post
VIEW IN TELEGRAM
Чем catch с when отличается от проверки if внутри catch?
Ответ: Фильтр when определяет, подходит ли обработчик, ещё до раскрутки стека. Условие if выполняется уже после входа в catch.
В конструкции catch (Exception ex) when (CanHandle(ex)) обработчик будет выбран только при истинном результате фильтра. Если фильтр вернул false, поиск подходящего catch продолжается. В том числе может сработать следующий catch у того же try.
Если же проверять условие внутри catch, исключение уже перехвачено. Чтобы передать его дальше, придётся явно выполнить throw; — к следующим catch того же try выполнение уже не перейдёт.
При этом throw; сохраняет исходный стек исключения. Его не стоит заменять на throw ex;, который меняет информацию о стеке.
Подробнее в документации Microsoft Learn
🐸 Библиотека собеса по C#
В конструкции catch (Exception ex) when (CanHandle(ex)) обработчик будет выбран только при истинном результате фильтра. Если фильтр вернул false, поиск подходящего catch продолжается. В том числе может сработать следующий catch у того же try.
Если же проверять условие внутри catch, исключение уже перехвачено. Чтобы передать его дальше, придётся явно выполнить throw; — к следующим catch того же try выполнение уже не перейдёт.
При этом throw; сохраняет исходный стек исключения. Его не стоит заменять на throw ex;, который меняет информацию о стеке.
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
Exception-handling statements - throw and try, catch, finally - C# reference
Use the C# throw statement to signal an occurrence of an exception. Use the C# try statements to catch and process exceptions occurred in a block of code.
Будет ли повторно вызван статический конструктор после исключения?
Ответ: Нет. Если статический конструктор завершился необработанным исключением, среда выполнения не запускает его заново для того же загруженного типа.
Тип остаётся неинициализированным. Обращение, требующее его инициализации, обычно приводит к TypeInitializationException; исходную причину можно посмотреть в InnerException. Повторный вызов такого обращения не становится повторной попыткой выполнить конструктор.
Поэтому временно недоступный сервер или файл — плохая зависимость для статического конструктора. Даже если ресурс появится позже, автоматического восстановления типа не произойдёт.
Если операции нужны повторные попытки, их следует организовать отдельно от статической инициализации.
Подробнее в документации Microsoft Learn
🐸 Библиотека собеса по C#
Тип остаётся неинициализированным. Обращение, требующее его инициализации, обычно приводит к TypeInitializationException; исходную причину можно посмотреть в InnerException. Повторный вызов такого обращения не становится повторной попыткой выполнить конструктор.
Поэтому временно недоступный сервер или файл — плохая зависимость для статического конструктора. Даже если ресурс появится позже, автоматического восстановления типа не произойдёт.
Если операции нужны повторные попытки, их следует организовать отдельно от статической инициализации.
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
Static Constructors - C#
A static constructor in C# initializes static data or performs an action done only once. It runs before the first instance is created or static members are referenced.
Где искать все исключения, если несколько задач в Task.WhenAll завершились с ошибкой?
Ответ: В свойстве Exception задачи, которую вернул Task.WhenAll. Оно содержит AggregateException с ошибками завершившихся задач. При await обычно выбрасывается одно из этих исключений, поэтому одного пойманного исключения недостаточно, чтобы узнать обо всех сбоях. Сохраните общую задачу в переменную, дождитесь её и при ошибке проверьте Exception.InnerExceptions. Для вложенных агрегатов можно использовать Flatten(). WhenAll дожидается всех переданных задач, а не завершается сразу после первой ошибки.
Документация: Task.WhenAll
Основа вопроса: Список собеседований Alibaba Travels, раздел Task.WhenAll.
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
Основа вопроса: Список собеседований Alibaba Travels, раздел Task.WhenAll.
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
Task.WhenAll Method (System.Threading.Tasks)
Creates a task that will complete when all of the supplied tasks have completed.
Чем ExecutionContext отличается от SynchronizationContext?
Ответ: ExecutionContext переносит логическое окружение выполнения, например значения AsyncLocal. SynchronizationContext определяет, как и куда отправить продолжение: например, в очередь потока интерфейса. Это разные механизмы. ConfigureAwait(false) отключает попытку вернуться в захваченный контекст синхронизации, но сам по себе не запрещает перенос ExecutionContext. Поэтому значения AsyncLocal обычно сохраняются и после такого await.
Документация: ExecutionContext и SynchronizationContext
Основа вопроса: Список собеседований Alibaba Travels.
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
Основа вопроса: Список собеседований Alibaba Travels.
Please open Telegram to view this post
VIEW IN TELEGRAM
Microsoft News
ExecutionContext vs SynchronizationContext
I’ve been asked a few times recently various questions about ExecutionContext and SynchronizationContext, for example what the differences are between them, what it means to “flow” them, and how they relate to the new async/await keywords in C# and Visual…
Чем скрытие метода через new отличается от override?
Ответ: override заменяет реализацию виртуального метода. При вызове через ссылку базового типа выбирается реализация по фактическому типу объекта. new создаёт отдельный метод, который скрывает одноимённый член. Какой из них доступен при обычном вызове, зависит от типа переменной. Поэтому один объект может вести себя по-разному при обращении через переменные базового и производного типов. new не превращает скрытие в переопределение.
Документация: new и override
Основа вопроса: Материалы собеседований Alibaba Travels, раздел new versus override.
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
Основа вопроса: Материалы собеседований Alibaba Travels, раздел new versus override.
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
Versioning with the Override and New Keywords - C#
Learn about versioning for base and derived classes in C#, and how to specify whether a method is intended to override or hide an inherited method.
🥱1
Почему для денежных расчётов часто выбирают decimal, а не double?
Ответ: decimal хранит числа в десятичном представлении и точно представляет многие привычные десятичные дроби, например 0.1. double использует двоичное представление: для таких значений обычно приходится хранить приближение. Но decimal не отменяет округление. Например, результат деления единицы на три не представим точно и в этом типе. Для расчётов всё равно нужны правила точности и округления. Выбор типа сам по себе их не задаёт.
Документация: double и decimal
Основа вопроса: Материалы собеседований Alibaba Travels, раздел double versus decimal.
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
Основа вопроса: Материалы собеседований Alibaba Travels, раздел double versus decimal.
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
Floating-point numeric types - C# reference
Learn about the built-in C# floating-point types: float, double, and decimal
Почему Dictionary может перестать находить ключ после изменения его полей?
Ответ: Если изменённые поля участвуют в вычислении хеша или сравнении ключей, объект может перестать соответствовать условиям, с которыми его добавили в словарь. При вставке словарь сохраняет хеш, а при поиске вычисляет его заново. Изменившийся хеш может направить поиск в другое место. Поэтому данные, от которых зависят равенство и хеш ключа, должны оставаться стабильными, пока ключ хранится в словаре. Изменение постороннего поля само по себе такой проблемы не создаёт.
Документация: требования к ключам Dictionary
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
Dictionary<TKey,TValue> Class (System.Collections.Generic)
Represents a collection of keys and values.
Гарантирует ли IReadOnlyList, что коллекцию и её элементы никто не изменит?
Ответ: Нет. Интерфейс позволяет читать элементы и размер списка, но не обещает, что сам объект неизменяемый. Например, обычный List можно передать как IReadOnlyList и продолжать менять через другую ссылку. Эти изменения будут видны читателю. Кроме того, элементы могут быть изменяемыми объектами. Даже неизменяемая структура коллекции не делает их неизменяемыми автоматически. Если нужен снимок данных, его нужно создавать отдельно.
Документация: IReadOnlyList
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
IReadOnlyList<T> Interface (System.Collections.Generic)
Represents a read-only collection of elements that can be accessed by index.
Зачем структуре IEquatable<T>, если уже есть Equals(object)?
Ответ: Интерфейс задаёт типизированный метод сравнения. Ему не нужно принимать значение как object. Стандартный EqualityComparer<T>.Default использует эту реализацию, что позволяет сравнивать структуры без упаковки ради вызова Equals(object). При этом реализации должны быть согласованы: типизированный Equals, Equals(object) и GetHashCode должны одинаково понимать равенство. Если два значения равны, их хеши тоже должны совпадать.
Документация: IEquatable<T>
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
IEquatable<T> Interface (System)
Defines a generalized method that a value type or class implements to create a type-specific method for determining equality of instances.
Повторит ли Lazy<T> создание значения после ошибки в фабрике?
Ответ: Для фабрики с режимом ExecutionAndPublication — нет. Исключение сохраняется, и следующие обращения к Value снова его выбрасывают. Повторного вызова фабрики не будет. В режиме PublicationOnly исключения фабрики не кэшируются: следующее обращение может запустить её заново. Но этот режим также допускает одновременную работу нескольких фабрик. Поэтому поведение зависит от способа создания Lazy, а не только от самого типа.
Документация: ленивая инициализация и кэширование исключений
➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии
🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Docs
Lazy Initialization - .NET Framework
Explore lazy initialization in .NET, a performance improvement that means an object creation is deferred until the object is first used.
При обычном приведении из object обратно к структуре значение снова копируется. Тип при распаковке должен совпадать с упакованным: если в object лежит int, выражение (long)value выбросит InvalidCastException. Сначала нужно распаковать int, затем преобразовать его в long.
Поля ссылочного типа копируются вместе со ссылками. Поэтому две копии структуры могут продолжать работать с одним вложенным объектом.
Вопрос из подборки для собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
List<T> допускает добавление элементов и остаётся инвариантным. Если бы List<string> можно было использовать как List<object>, через такую ссылку в список строк удалось бы добавить число.
Для чтения выбирайте подходящий интерфейс. Преобразование IEnumerable<string> в IEnumerable<object> не копирует элементы. Эта вариантность работает со ссылочными типами: IEnumerable<int> так преобразовать нельзя.
Вопрос из подборки для собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Один экземпляр ValueTask в общем случае нужно ожидать один раз. Он может опираться на переиспользуемый IValueTaskSource, для которого повторный await не поддерживается.
Если результат требуется ожидать несколько раз или передавать в комбинации задач, один раз вызовите AsTask() и сохраните полученную Task. Выбор ValueTask стоит подтверждать измерениями; обычный Task остаётся удобным вариантом для большинства API.
Вопрос из подборки для собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM