下面的代码
class Animal : IDisposable
{
static string Invoker()
{
using (Animal a = new Animal())
{
return a.Greeting();
}
}
public void Dispose()
{
Console.WriteLine("Disposed");
}
public string Greeting()
{
return "Hello World";
}
static void Main()
{
Console.WriteLine("Before");
Console.WriteLine(Invoker());
Console.WriteLine("After");
}
}
产生
Before
Disposed
Hello World
After
因为这个输出中 Disposed 出现在 Hello World 之前,我猜
using (Animal a = new Animal())
{
return a.Greeting();
}
相当于
Animal a = new Animal();
string buffer = null;
try
{
buffer = a.Greeting();
}
finally
{
a.Dispose();
return buffer;
}
但是,它显然不正确,因为出现以下错误消息:
控制不能离开finally块的主体。
那么我最终的猜测就变成了如下。
Animal a = new Animal();
string buffer = null;
try
{
buffer = a.Greeting();
return buffer;
}
finally
{
a.Dispose();
//return buffer;
}
但是,我仍然很困惑,如果 在执行顺序中排在第一位,如何调用 Dispose() 。 提前离开函数体使得 必须由某些东西(其他代理或线程或垃圾收集器或我不详细了解的任何隐藏机制)调用。这是我的想象。 另外,如果 首先出现,那么输出应该是return bufferDispose()return buffer
Before
Hello World
Disposed
After
问题
你能告诉我编译器或内部机制如何调用Dispose() while return buffer 首先出现,导致过早离开函数体Invoker?
茅侃侃
临摹微笑
相关分类