处置班级需要的对象?

时间:2012-03-27 01:28:23

标签: c# winforms class parameters dispose

我知道我必须在类或表单中处理所有非托管资源..但是如果我将套接字传递给类然后我想处理类并保留套接字该怎么办呢?

form1.cs中的

  • 我使用TCP套接字从服务器读取命令
  • 我有一个类使用相同的套接字向服务器发送命令

    所以当我初始化类时..我将在form1中使用的套接字传递给类..我想知道如果我从类中调用socket.dispose(),form1.cs中的套接字是否处理?

    我在处理课程时是否必须处理插座或只是socket = null会好吗? (但我需要套接字,即使我想处理该类,因为我想继续从服务器接收命令)。

    班级:

    public class TM
    {
        Socket client;
        public TM(Socket socket)
        {
            client = socket;
        }
    
        public void Dispose()
        {
            client = null; // or client.Dispose()
    
            GC.SuppressFinalize(this);
        }
    
        ~TM()
        {
            Dispose();
        }
    
     }
    

    Form1.cs的

    TM tm = new TM(client);
    private void whatever() 
    {
    
    StreamReader sr = new StreamReader(new NetworkStream(client));
    while ((cmd = sr.ReadLine()) != null)   //this socket need to keep receiving commands even if i disposed the class
    {
         Console.WriteLine(cmd);
    }
    }
    
    private void Button1_Click(object sender, EventArgs e)
    {
            tm.Dispose();
    }
    
    抱歉我的英语不好,我希望你明白我的意思..提前谢谢。

  • 3 个答案:

    答案 0 :(得分:3)

    首先,如果您要使用Dispose,请执行IDisposableMSDN显示了实现您尝试的模式的正确方法。

    对于实际问题:由于您实际上并未处理Socket Dispose中的TM,因此它既未关闭也未处置。实现它的方式,由调用者来管理socket的生命周期。如果TM不负责创建套接字,则它也不应负责套接字清理。这样做可能导致难以追查错误和意外行为。

    答案 1 :(得分:1)

    类中的代码不会处理套接字。这是应该的方式,因为它没有创建它。 即使您的类TM的对象被销毁,套接字也将根据您的代码提供。

    答案 2 :(得分:0)

    不能通过拨打tm.Dispose();来解决您的套接字client。您只需在完成套接字后调用client.Close()即可将其关闭并进行处理。