Оператор using (...) является синтаксическим сахаром для try {} finally {}.
Но если у меня будет оператор using, как показано ниже:
using (FileStream fs = File.Open(path))
{
}
Теперь я хочу поймать исключения, которые может вызвать открытие этого файла (и это код с довольно высоким риском, поскольку он может выйти из строя из-за окружающей среды), но если я напишу внутри try-catch, не будет ли это повторением? Когда код компилируется в IL, я предполагаю, что повтор будет удален, когда код будет JITted?
Однако я бы хотел поймать исключения, которые может вызвать открытие файла (поэтому я должен обернуть try-catch за пределы области действия оператора using), а также исключения для всего, что я делаю внутри блока using, поэтому я должен добавить try-catch внутри блока.
Похоже, я добавляю много повторений к тому, что, вероятно, делает внутри CLR. Добавляет ли CLR предложения catch?
Мой коллега утверждал, что оператор using беспорядочный (но это произошло из-за того, что одна строка была немного длинной из-за того, что я жестко их кодировал, так как мне нужно было изменить их очень быстро и у меня не было доступа к другим частям базы кода). Указанный коллега не использует оператор using, но есть ли какая-либо функциональная разница между оператором using и try-finally / try-catch-finally? Я видел один такой случай, когда у служб WCF есть малоизвестный угловой случай использования finally и возврата значений (что-то вроде finally). Решением было использование контрольного блока. Есть ли что-нибудь подобное в C #?
С другой стороны, все ли типы, реализующие IDisposale, являются владельцами неуправляемых ресурсов? Обсуждение с моим другом показало, что ответ отрицательный. (Я также прочитал несколько тем в разделе использования этого форума, там есть очень хорошие знания).