Почему моя локально объявленная переменная не распознается в блоке finally? - PullRequest
2 голосов
/ 14 января 2012

С кодом ниже я получаю: «Имя« слушатель »не существует в текущем контексте»

В самом деле? Почему?

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

Ответы [ 5 ]

8 голосов
/ 14 января 2012

Вот так работает C # scoping.Это мешает в 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, инициализируйте переменную в null и проверьте, что перед вызовом Stop.

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

6 голосов
/ 14 января 2012

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

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

3 голосов
/ 14 января 2012

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

2 голосов
/ 14 января 2012

Вы думаете, что область действия попытки - это вся попытка, улов (ы) и окончание, но области действия - это область между { } '

2 голосов
/ 14 января 2012

Потому что C # - это язык на основе C.

{
  int x = 5;

  // x is 5 here
}

// x is undefined out here.

локальная область действия по сравнению с глобальной областью действия

При определении в {} все локально внутри {}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...