我不确定在goto
块中使用using
。
例如:
using(stream s = new stream("blah blah blah"));
{
//do some stuff here
if(someCondition) goto myLabel;
}
现在如果someCondition
为真,代码执行将转移到myLabel
,但是,对象是否会被处理?
我在这个主题上看到了一些非常好的问题,但他们都在谈论不同的事情。
答案 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
块就会发生,无论它退出的是什么。