GOTO里面使用块,对象会被处理掉吗?

时间:2012-09-25 13:43:15

标签: c# .net .net-4.0

我不确定在goto块中使用using

例如:

using(stream s = new stream("blah blah blah"));
{
    //do some stuff here

    if(someCondition) goto myLabel;
}

现在如果someCondition为真,代码执行将转移到myLabel,但是,对象是否会被处理?

我在这个主题上看到了一些非常好的问题,但他们都在谈论不同的事情。

4 个答案:

答案 0 :(得分:7)

是。


但为什么不亲自尝试呢?

void Main()
{
    using(new Test())
    {
        goto myLabel;
    }
myLabel:
    "End".Dump();
}
class Test:IDisposable
{
    public void Dispose()
    {
        "Disposed".Dump();
    }
}

结果:

  

处理完毕
  端

答案 1 :(得分:3)

using语句本质上是一个try-finally块和一个包含在一个简单语句中的dispose模式。

using (Font font1 = new Font("Arial", 10.0f))
{
    //your code
}

相当于

Font font1 = new Font("Arial", 10.0f);
try
{
     //your code
}
finally
{
     //Font gets disposed here
}

因此,任何来自“try-block”的跳转,无论是抛出异常,还是使用goto(unclean!)& tc。将执行“最终”块中正在使用的对象的处理..

答案 2 :(得分:1)

让我们试试:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            using (var obj = new TestObj())
            {
                if (i == 0) goto Label;
            }
            Console.WriteLine("some code here");

        Label:
            Console.WriteLine("after label");

        Console.Read();
        }
    }

    class TestObj : IDisposable
    {
        public void Dispose()
        {
            Console.WriteLine("disposed");
        }
    }

}

控制台输出是: 处置 标签后

Dispose()在标签之后的代码之前执行。

答案 3 :(得分:1)

using(Stream s = new Stream("blah blah blah"))
{    
    if(someCondition) goto myLabel;
}

等于

Stream s;
try
{
     s = new Stream("blah blah blah");
     if(someCondition) goto myLabel;
}
finally
{
  if (s != null)
    ((IDisposable)s).Dispose();
}

因此,只要您离开using块,finally块就会发生,无论它退出的是什么。