Любые исключения, возникающие в выражении инициализации оператора using, будут распространять область действия метода и стек вызовов, как ожидалось.
Следует заметить, что если в выражении инициализации возникает исключение, метод Dispose() не будет вызываться в переменной выражения. Это почти всегда поведение, которое вам нужно, поскольку вы не хотите беспокоиться о том, чтобы удалить объект, который на самом деле не был создан. Однако в сложных условиях может возникнуть проблема. То есть, если несколько нескольких инициализаций захоронены внутри конструктора, а некоторые преуспевают до того, как будет выбрано исключение, тогда вызов Dispose может не произойти в этой точке. Обычно это не проблема, поскольку конструкторы обычно сохраняются просто.
Я абсолютно уверен, что ваша «гоча» неточна. Поскольку класс StreamReader реализует IDisposable, оператор using позаботится об утилизации объекта. Поскольку оператор using действует как блок finally, не имеет значения, есть ли у вас исключение или возврат. – 2008-09-29 17:12:31
В соответствии с http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx команды catch и finally все еще выполняются. Поскольку «использование» компиляции в качестве блока finally, в вашем примере будет использоваться программатор-плейер. – Uhall 2008-09-29 17:14:36