0
我只是寫一個聊天應用程序(服務器)和我有一個問題。如何正確地將實例引用傳遞給另一個類的構造函數?
服務器接受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()循環進入下一次迭代時,我都可以在調試器中看到Client實例已被丟棄(通過垃圾回收器,我想)。
因此,當另一個迭代開始時,Users
列表中的所有Connection
實例都可以,但是它們對TcpClient
的引用僅指回收的實例。因此,連接立即關閉,無法完成工作。
你知道問題出在哪裏?感謝您的答案。
您可能需要確切的源代碼 - 如果是的話,我可以提供它,當然。
哪個客戶端被設置?你隱式創建2:第一個是「new TcpClient()」,第二個是由「AcceptTcpClient」返回的,最終會導致第一個被拋棄。 – Joe
它回收AcceptTcpClient對象。第一個「空白」對象「消失」,就像我在下面一行中調用AcceptTcpClient()一樣快。如果我理解的很好,不需要Client = new TcpClient(),好嗎?但是,我試圖刪除它,但它沒有解決問題。 –
「對象引用」與「對象指針」相比,問題在於garbarge收集器「決定」何時處置每個對象,而不是「當程序員忘記它時處理對象」 – umlcat