Можно ли вызвать метод на удаленном объекте? Если да, то почему?
В следующей демонстрационной программе у меня есть одноразовый класс A
(который реализует интерфейс IDisposable
). Насколько я знаю, если я передаю одноразовый объект в конструкцию using()
, тогда метод Dispose()
получит автоматически вызывается в закрывающей скобке:
A a = new A();
using (a)
{
//...
}//<--------- a.Dispose() gets called here!
//here the object is supposed to be disposed,
//and shouldn't be used, as far as I understand.
Если это правильно, то, пожалуйста, объясните вывод этой программы:
public class A : IDisposable
{
int i = 100;
public void Dispose()
{
Console.WriteLine("Dispose() called");
}
public void f()
{
Console.WriteLine("{0}", i); i *= 2;
}
}
public class Test
{
public static void Main()
{
A a = new A();
Console.WriteLine("Before using()");
a.f();
using ( a)
{
Console.WriteLine("Inside using()");
a.f();
}
Console.WriteLine("After using()");
a.f();
}
}
Выход (ideone):
Before using()
100
Inside using()
200
Dispose() called
After using()
400
Как я могу называть f()
на размещенном объекте A
? Это разрешено? Если да, то почему? Если нет, то почему указанная выше программа не дает исключений во время выполнения?
Я знаю, что популярная конструкция использования using
такова:
using (A a = new A())
{
//working with a
}
Но я просто экспериментирую, поэтому я написал это по-другому.