2012-01-13 3 views
2

아래 코드와 함께 : "이름 '리스너'가 현재 컨텍스트에 존재하지 않습니다."로컬에서 선언 된 변수가 finally 블록에서 인식되지 않는 이유는 무엇입니까?

정말요? 왜?

static void ReceiveSocketMsgs() 
{ 
    try 
    { 
     TcpListener listener; 
     listener = new TcpListener(IPAddress.Any, MainForm.GOHRFTrackerMainForm.socketPortNum); 
     listener.Start(); 
     using (TcpClient c = listener.AcceptTcpClient()) 
     { 
      using (NetworkStream n = c.GetStream()) 
      { 
       string msg = new BinaryReader(n).ReadString(); 
       BinaryWriter w = new BinaryWriter(n); 
       w.Write(msg + " received"); 
       w.Flush(); // Must call Flush because we're not disposing the writer. 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     //some exception (if you close the app, it will be "threadabort") 
    } 
    finally 
    { 
     listener.Stop(); 
    } 
} 

답변

8

C# 범위 지정이 작동하는 방식입니다. 그것은 lock 진술 문과 try/catch 절에서 방해가됩니다. 단지 외부 선언을 이동 :

static void ReceiveSocketMsgs() 
{ 
    TcpListener listener = null; 
    try 
    { 
     listener = new TcpListener(IPAddress.Any, MainForm.GOHRFTrackerMainForm.socketPortNum); 
     ... 
    } 
    catch (Exception ex) 
    { 
     //some exception (if you close the app, it will be "threadabort") 
    } 
    finally 
    { 
     if (listener != null) 
      listener.Stop(); 
    } 
} 

를 null과 Stop를 호출하기 전에 그것을 확인하는 변수를 초기화의 try 블록 내부의 리스너 초기화를 유지하기 위해.

초기화가 수정되었습니다. BoltClock을 발견했습니다.

+0

또는 마지막에 널 (null)을 확인합니다. TcpListener()에서 예외가 발생하면 어떻게됩니까? –

+0

나는 내 초기 관찰을 확신 할 수 없지만, 어쩌면 나는 피곤하고 휴식이 필요하다. 어느 쪽이든, 방어 프로그래밍은 언제나 좋다. – BoltClock

+0

@BoltClock 고침, 고마워. 당신의 관찰은 정확했습니다; 코드는 컴파일되지 않았을 것입니다 :) –

6

try 블록의 범위에서 변수를 정의했기 때문에. finally 블록 내부의 try 블록 외부에 있기 때문에 더 이상 변수에 액세스 할 수 없습니다.

간단한 수정은 try 블록의 범위 밖에있는 리스너를 선언하여 필요한 모든 곳에서 액세스 할 수 있도록하는 것입니다.

2

C#은 C 기반 언어이기 때문에. 글로벌 스코프 대

{ 
    int x = 5; 

    // x is 5 here 
} 

// x is undefined out here. 

로컬 범위가

에 정의

{} 모든 것이 내 로컬 {}.

3

listener은 선언 된 범위 밖에서 중지되기 때문에. 이 경우에는 try (catch 또는 finally) 블록에서만 사용할 수 있습니다. 당신은 시도 범위를 생각

2

는 전체 시도, 캐치 (들)과 마지막이지만, 범위는이 지역의 사이입니다 { }

관련 문제