使用下面的代码,我得到:"名称'听众'在当前上下文中不存在"
真的?为什么呢?
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();
}
}
答案 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,但范围是{ }
之间的区域