class TestNet
    {
        TcpClient _client = null;
        NetworkStream ns = null;
        public TestNet()
        {
            _client = new TcpClient("127.0.0.1", int.Parse("7000"));
            ns = _client.GetStream();
        }        ~TestNet()
        {
            string sendStr = "123456789";
            byte[] data = System.Text.Encoding.UTF8.GetBytes (sendStr);
            ns.Write(data ,0, data.Length);// 非托管资源已释放
            
        }
    }

解决方案 »

  1.   

    最好不要在析构函数里做这种事情,可能 _client 和 ns 先被析构掉了,如果你要释放,就指定一个方法,手动调用吧
      

  2.   


    试试把
    TcpClient _client = null;
    NetworkStream ns = null;
    声明为静态的
      

  3.   

    那就在~TestNet()里重新建一个NetworkStream,不要用原来的ns
      

  4.   

    这是c#,不是c++。不要乱套用析构函数的概念。这根本不是c++。
      

  5.   

    在.net中,许多对象的析构函数其实根本不执行,因为在dispose方法中就已经通知GC阻止调用析构函数了。想要保证逻辑上去处理所谓清理代码,应该让你的类型使用IDisposable接口,并且在调用对象时使用using{}结构确保可以调用dispose方法。你的dispose方法会尽早执行,此时析构函数还不知道何年何月才执行呢。
      

  6.   

    这样写吧
    ~TestNet()
    {
        try
        {
            using (TcpClient tc = new TcpClient("127.0.0.1", int.Parse("7000")))
            {
                string sendStr = "123456789";
                byte[] data = System.Text.Encoding.UTF8.GetBytes(sendStr);
                tc.GetStream().Write(data, 0, data.Length);// 非托管资源已释放
            }
        }
        catch (Exception)
        {
        }
    }
      

  7.   

    因为在析构TestNet之前,ns就已经被析构了。成员变量先被构造,同样也先被析构,这就是为啥析构函数中的Dispose方法的参数值是False,防止重复析构
      

  8.   

    谢谢!! 我有这个想法主要是因为以前已经这么写了,所以想兼容以前的.请问:如果TestNet实了现IDisposable接口,也只有用using才会调用Dispose方法吗?
      

  9.   

    Dispose会在对象销毁前被调用的,即使你不用using,总有被销毁的时候,那个时候就会自动被调用。