Повторното инициализиране в рамките на блока "използване" е лоша идея, трябва да се избягва по всяко време. Все пак ще попитам това:
Защо извикването "using" разполага с оригиналната стойност, а не с последната препратка или повторно инициализиране (което се случва, ако се използва try finally block)
MyClass b = new MyClass();// implements Idisposable
MyClass c = new MyClass();
MyClass a ;
using (a = new MyClass())
{
a = b;
a = c;
}
В горния код dispose ще бъде извикан на оригиналната препратка, а не на по-новата препратка. Това може лесно да се провери чрез отпечатване на нещо на конзолата в метода dispose.
Въпреки това с try{} finally code се извиква последният референтен метод за изхвърляне.
try
{
a = new MyClass();
a = b;
a = c;
}
finally
{
a.Dispose();
}
MSDN : Инструкцията за използване гарантира, че 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();
}
}