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

本文关键字:另一个 构造函数 正确地 实例 引用 | 更新日期: 2023-09-27 18:36:27

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

服务器接受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实例引用了客户端对象。直到这里一切正常,但是每次 while() 循环进入下一次迭代时,我都可以在调试器中看到客户端实例已释放(我想是通过垃圾回收器)。

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

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

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

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

它不是一个单一的连接。

这里有两件事重叠。

事实上,"连接"取决于要创建的客户端,并且您正在创建多个客户端和多个相应的连接。

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

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(...)

干杯。

相关文章: