当前位置:  开发笔记 > 编程语言 > 正文

您如何看待我的IDisposable模式实现?

如何解决《您如何看待我的IDisposable模式实现?》经验,为你挑选了1个好方法。

您如何看待以下IDisposable模式实现?

public class Connection : IDisposable 
{
    private Socket _socket;

    public bool IsConnected()
    {
        if (_socket.Poll(1, SelectMode.SelectRead) && _socket.Available == 0)
            return false;
        return true;
    }

    public void Disconnect()
    {
        if (m_socket != null && IsConnected())
        {
            try
            {
                _socket.Shutdown(SocketShutdown.Both);
                _socket.Disconnect(false);
            }
            catch (SocketException se)
            {
                System.Console.WriteLine(se.Message);
            }
        }
    }

    ~Connection()
    {
        Dispose(false);
    }

    private void Dispose(bool disposing)
    {
        if (!IsConnected())
        {
            if (disposing)
            {
                Disconnect();
            }
            else
            {
                AppDomain currentDomain = AppDomain.CurrentDomain;
                if (currentDomain.IsFinalizingForUnload() && !Environment.HasShutdownStarted)
                {
                     System.Console.WriteLine("Client failed to call Destroy");
                }
            }
        }
    }
}

我使用上面的代码给出了这个错误:

{"尝试对不是套接字的操作进行操作"} System.Net.Sockets.Socket.Poll(Int32 microSeconds,SelectMode模式)

casperOne.. 11

实施存在严重缺陷.你没有真正实现IDisposable,你最终依靠垃圾收集器来清理你的资源,这是一件坏事.

此外,当GC确实出现时,你甚至都没有正确地清理这些资源(它确实正确地执行了,但错误的是它发生了).

IDisposable当您持有实现的引用时,您的类负责实现IDisposable.然后,在你的实现中Dispose,如果你没有被GCed(它是一个显式的调用Dispose),你将调用你正在持有的Dispose任何IDisposable实现.

您检查了连接状态Socket,但这与调用Dispose它不同,并且您因此泄漏了资源(GC最终将其取出).

有关如何正确实现的准则IDisposable,请参阅位于此处的MSDN文档"实现完成并部署以清理非托管资源"部分:

http://msdn.microsoft.com/en-us/library/b1yfkh5e(VS.71).aspx

我应该注意到,我不完全同意这些指导方针,但它们是最常用的.对于我的立场,请看这里:

http://www.caspershouse.com/post/A-Better-Implementation-Pattern-for-IDisposable.aspx



1> casperOne..:

实施存在严重缺陷.你没有真正实现IDisposable,你最终依靠垃圾收集器来清理你的资源,这是一件坏事.

此外,当GC确实出现时,你甚至都没有正确地清理这些资源(它确实正确地执行了,但错误的是它发生了).

IDisposable当您持有实现的引用时,您的类负责实现IDisposable.然后,在你的实现中Dispose,如果你没有被GCed(它是一个显式的调用Dispose),你将调用你正在持有的Dispose任何IDisposable实现.

您检查了连接状态Socket,但这与调用Dispose它不同,并且您因此泄漏了资源(GC最终将其取出).

有关如何正确实现的准则IDisposable,请参阅位于此处的MSDN文档"实现完成并部署以清理非托管资源"部分:

http://msdn.microsoft.com/en-us/library/b1yfkh5e(VS.71).aspx

我应该注意到,我不完全同意这些指导方针,但它们是最常用的.对于我的立场,请看这里:

http://www.caspershouse.com/post/A-Better-Implementation-Pattern-for-IDisposable.aspx

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有