C# 控制台程序、静态方法、套接字变为空

C# 控制台程序、静态方法、套接字变为空,c#,.net,static,static-methods,static-members,C#,.net,Static,Static Methods,Static Members,当谈到Send方法时,我会得到NullReferenceException。在调试中(我添加了m_sock来监视),我看到当程序进入SendRequest时,m_sock方法变为null。我不明白为什么会这样,问题出在哪里。请提供帮助。m_sock是在Main内部以及类级别定义的,您不必在Main中再次定义它,只需初始化它,如: class Program { static Socket m_sock; static void Main(string[] args) {

当谈到Send方法时,我会得到NullReferenceException。在调试中(我添加了m_sock来监视),我看到当程序进入SendRequest时,m_sock方法变为null。我不明白为什么会这样,问题出在哪里。请提供帮助。

m_sock
是在Main内部以及类级别定义的,您不必在Main中再次定义它,只需初始化它,如:

class Program
{
    static Socket m_sock;

    static void Main(string[] args)
    {
        Socket m_sock= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        .
        .
        .
        m_sock.Connect(ipendLocalhost);
        SendRequest("command");
    }

    static void SendRequest(string sCommand)
    {
       .
       .
     **m_sock.Send(szCommand, iBytesToSend, SocketFlags.None);**
     }
请注意,
插座
已卸下


当前,您的主方法正在初始化本地
m_sock
,这就是为什么类级别
m_sock
保持为空,稍后在静态方法中访问它时,您将获得异常

m_sock
是在Main内部以及类级别定义的,您不必在Main中再次定义它,只需初始化它,如:

class Program
{
    static Socket m_sock;

    static void Main(string[] args)
    {
        Socket m_sock= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        .
        .
        .
        m_sock.Connect(ipendLocalhost);
        SendRequest("command");
    }

    static void SendRequest(string sCommand)
    {
       .
       .
     **m_sock.Send(szCommand, iBytesToSend, SocketFlags.None);**
     }
请注意,
插座
已卸下


当前,您的主方法正在初始化本地
m_sock
,这就是为什么类级别
m_sock
保持为空,稍后在静态方法中访问它时,您将获得异常

因为您在Main中声明了另一个
m_sock

static void Main(string[] args)
    {
        m_sock= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
换成

Socket m_sock=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

因为您在Main中声明了另一个
m_sock

static void Main(string[] args)
    {
        m_sock= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
换成

Socket m_sock=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

问题来自Main中的声明,
Socket m_sock=
在类级别隐藏该字段

m_sock=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
将初始化更改为

static Socket m_sock;
static void Main(string[] args)
{
    Socket m_sock = new Socket // Create a new Socket in m_sock from the Main method only
    SendRequest("command");
}

static void SendRequest(string sCommand)
{
  m_sock.Send() // Uses the socket at the Class level, which is not initialized
}
或者删除类级声明并将其作为变量传递

static void Main(string[] args)
{
    m_sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    m_sock.Connect(ipendLocalhost);

    SendRequest("command");
}

问题来自Main中的声明,
Socket m_sock=
在类级别隐藏该字段

m_sock=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
将初始化更改为

static Socket m_sock;
static void Main(string[] args)
{
    Socket m_sock = new Socket // Create a new Socket in m_sock from the Main method only
    SendRequest("command");
}

static void SendRequest(string sCommand)
{
  m_sock.Send() // Uses the socket at the Class level, which is not initialized
}
或者删除类级声明并将其作为变量传递

static void Main(string[] args)
{
    m_sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    m_sock.Connect(ipendLocalhost);

    SendRequest("command");
}

在main中,将
Socket m_sock=
更改为
m_sock=
。您不想用相同的名称声明局部变量,只需初始化全局变量。在main中,将
Socket m_sock=
更改为
m_sock=
。如果不想声明同名的局部变量,只需初始化全局变量。这是原因,但解决方案是什么?这是原因,但解决方案是什么?建议传递+1<代码>静态变量应小心使用,在这种情况下也应处理掉。+1建议传递<代码>静态变量应小心使用,在这种情况下也应丢弃。