为什么我的本地声明的变量在finally块中没有被识别?

时间:2012-01-13 20:52:15

标签: c# sockets

使用下面的代码,我得到:"名称'听众'在当前上下文中不存在"

真的?为什么呢?

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 个答案:

答案 0 :(得分: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块内,请将变量初始化为null并在调用Stop之前检查它。

修正了初始化问题。好好发现BoltClock。

答案 1 :(得分:6)

因为您在try块的范围内定义了变量。由于您位于finally块内的try块之外,因此您无法再访问该变量。

简单的解决方法是将侦听器声明在try块的范围之外,以便您可以随时随地访问它。

答案 2 :(得分:3)

因为listener在声明范围之外停止了。在这种情况下,它仅在try(但不是catch或finally)块中可用。

答案 3 :(得分:2)

因为C#是基于C语言的。

{
  int x = 5;

  // x is 5 here
}

// x is undefined out here.

本地范围与全球范围

在{}中定义时,{}内的所有内容都是本地的。

答案 4 :(得分:2)

您认为try范围是整个try,catch(s)和finally,但范围是{ }之间的区域