2012-01-13 6 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(); 
    } 
} 

Чтобы сохранить инициализацию слушателя внутри try блока, инициализировать переменную в нуль и проверить, что перед вызовом Stop.

Исправлена ​​инициализация. Хорошо заметили BoltClock.

+0

Или проверить нуль в конце концов. Что произойдет, если исключение выбрано из TcpListener()? –

+0

Я не настолько уверен в своем первоначальном наблюдении на самом деле, но, может быть, я просто устал и нуждаюсь в перерыве :) В любом случае, защитное программирование всегда хорошо. – BoltClock

+0

@BoltClock Исправлено, спасибо. Ваше наблюдение было правильным; код не был бы скомпилирован :) –

6

Поскольку вы определили переменную в объеме блока try. Поскольку вы находитесь за пределами блока try внутри блока finally, у вас больше нет доступа к переменной.

Простое исправление заключается в том, чтобы объявить слушателя вне области действия блока try, чтобы у вас был доступ к нему везде, где вам нужно.

2

Поскольку C# является языком на основе C.

{ 
    int x = 5; 

    // x is 5 here 
} 

// x is undefined out here. 

локальной области против глобального масштаба

Когда определено в {} все локальное в пределах {}.

3

Потому что listener остановлен за пределами области действия, где объявлено. Он доступен только в блоке try (но не catch или finally) в этом случае.

2

Вы думаете сферу попробовать это все попробовать, поймать (s) и, наконец, но прицелы района между { } «s

Смежные вопросы