3

ブロックgoto内での使用についてはよくわかりません。using

例えば:

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

    if(someCondition) goto myLabel;
}

someConditiontrueの場合、コードの実行はに進みますmyLabelが、オブジェクトは破棄されますか?

私はこのトピックに関してここでいくつかのかなり良い質問を見てきましたが、それらはすべて異なることについて話します。

4

4 に答える 4

8

はい。


しかし、自分で試してみませんか?

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

結果:

処分された
終わり

于 2012-09-25T13:46:34.047 に答える
3

usingステートメントは基本的にtry-finallyブロックであり、disposeパターンは1つの単純なステートメントにまとめられています。

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を使用します。その「finally」ブロックで使用されているオブジェクトの破棄を実行します。

于 2012-09-25T13:51:44.917 に答える
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()は、ラベルの後のコードの前に実行されます。

于 2012-09-25T13:52:21.607 に答える
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、何が原因でブロックが終了したかに関係なく、ブロックが発生します。

于 2012-09-25T13:54:30.513 に答える