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