如何正确地将实例引用传递给另一个类的构造函数?

时间:2012-06-07 18:18:03

标签: c# garbage-collection pass-by-reference

我只是在写一个聊天应用程序(服务器)而且我遇到了问题。

服务器接受TcpClient中的连接,然后创建Connection类的新实例,并将TcpClient的引用传递给它。这个新的Connection实例保存了引用以供将来使用。然后将新的Connection实例添加到Users列表中。

让我们看看伪代码:

while(true)
{
    // 1. Accept connection into new Client instance
    Client = new TcpClient()
    Client = AcceptTcpClient();
    // 2. Create new Connection object and pass Client's reference to it.
    Connection abc = new Connection(Client);

    // Add new user to users collection
    Users.Add(Connection);
}

现在abc实例引用了Client对象。直到这里它才行,但每次while()循环进入下一次迭代时,我都可以在调试器中看到客户端实例被处理掉(我猜想是垃圾收集器)。

因此,当另一个迭代开始时,Connection列表中的所有Users个实例都可以,但是它们对TcpClient的引用仅指回收的实例。因此,连接立即关闭,无法完成任何工作。

你知道问题出在哪里吗?谢谢你的回答。

您可能需要确切的源代码 - 如果是这样,我当然可以提供它。

1 个答案:

答案 0 :(得分:1)

它不是一个连接。

这里有两件事重叠。

“连接”取决于客户端,要创建,并且您正在创建多个客户端以及几个相应的连接。

你可以通过使用空引用来欺骗一点垃圾收集器,并在循环之外声明变量:

public void Dummy(ref Connection AConnection, ref TcpClient AClient)
{
  AConnection = null;
  AClient = null;
} // void Dummy(...)

public void Example()
{
  TcpClient Client = null;
  Connection abc = null;

  while(true)
  {
      // 1. create new Client instance, WITHOUT connection
      Client = new TcpClient()
      //Client = AcceptTcpClient();

      // 2. Create new Connection object that requires Client's reference to it.
      Connection abc = new Connection(Client);

      // Add new user to users collection
      Users.Add(abc);

      // uncomment only when debugging
      Dummy(ref abc, ref Client)
  } // while

  // uncomment only when debugging
  Client = null;
  abc = null;
} // void Example(...)

干杯。