2012-09-25 2 views
3

using 블록 안에 goto을 사용하는 것에 대해 확신이 없습니다. 예를 들어GOTO가 블록을 사용하여 내부 객체가 삭제됩니까?

: someCondition은, 코드 실행이 myLabel로 이동합니다 사실이지만, 경우 지금

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

    if(someCondition) goto myLabel; 
} 

은 객체가

를 배치받을 수 있습니까?

나는이 주제에 관해 꽤 좋은 질문을 보았다. 그러나 그들은 모두 다른 것에 대해 이야기한다.

+3

직접 확인하지 않으시겠습니까? – Leri

+9

'goto '를 사용하고 있습니까? ;-) – fero

+1

goto는 사용하지 않는 것이 좋습니다. 확실히 모범 사례는 아닙니다. 코드를 구조화 할 수있는 다른 방법이 있다고 확신하는 경우에는 코드를 구조화 할 수 있습니다. –

답변

3

using 문은 본질적으로 시도 - finally 블록과 하나 개의 간단한 문장에 싸서 처분 패턴입니다.

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

는 따라서, "시도 블록"에서 모든 점프, 그것은 예외, 고토 (부정!) & TC의 사용을 던지고

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

에 해당합니다. ..

+1

모든 대답이 같은 점을 만들기 때문에 하나만 선택하는 것은 중요하지 않습니다. 그러나 당신의 대리인이 낮기 때문에. :) –

6

예.


하지만 직접 시도하지 않으시겠습니까?

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

결과 :

하게 배치 된

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"); 
     } 
    } 

} 

콘솔 출력은 다음과 같습니다 레이블

폐기 (후 배치) 코드 전에 실행 레이블 다음에.

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

즉시 당신이 using 블록을 떠나 같은

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

에 동일의 finally 블록은 상관없이 종료 무엇을 만들어 발생하지 않습니다.

관련 문제