如何正确地将实例引用传递给另一个类的构造函数
本文关键字:另一个 构造函数 正确地 实例 引用 | 更新日期: 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(...)
干杯。