Повторная инициализация в блоке «using» — плохая идея, которой следует избегать всегда. И все же я спрошу это:
Почему «использующий» вызов распоряжается исходным значением, а не последней ссылкой или повторной инициализацией (что происходит, если используется блок try finally)
MyClass b = new MyClass();// implements Idisposable
MyClass c = new MyClass();
MyClass a ;
using (a = new MyClass())
{
a = b;
a = c;
}
В приведенном выше коде dispose будет вызываться по исходной ссылке, а не по новой ссылке. В этом легко убедиться, напечатав что-нибудь на консоли в методе dispose.
Однако с кодом try {} finally вызывается метод удаления последней ссылки.
try
{
a = new MyClass();
a = b;
a = c;
}
finally
{
a.Dispose();
}
MSDN: оператор using гарантирует, что Dispose вызывается даже в случае возникновения исключения. пока вы вызываете методы объекта.
using (Font font1 = new Font("Arial", 10.0f))
{
byte charset = font1.GdiCharSet;
}
В основном «использование» переводится как:
{
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}