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

标签 c# .net design-patterns idisposable

您如何看待以下 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");
                }
            }
        }
    }
}

我在使用上面的代码时遇到了这个错误:

{"An operation was attempted on something that is not a socket"} System.Net.Sockets.Socket.Poll(Int32 microSeconds, SelectMode mode)

最佳答案

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

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

您的类有责任实现IDisposable,因为您持有实现IDisposable 的引用。然后,在您执行 Dispose 的过程中,如果您没有被 GCed(这是对 Dispose 的显式调用),您将在您持有的任何 IDisposable 实现上调用 Dispose上。

您检查了 Socket 的连接状态,但这与在其上调用 Dispose 不同,结果您泄漏了资源(GC 最终选择了它上)。

有关如何正确实现 IDisposable 的指南,请参阅 MSDN 文档中标题为“实现 Finalize 和 Dispose 以清理非托管资源”的部分,位于此处:

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

我应该指出,我并不完全同意这些准则,但它们是最常被采用的。对于我的立场,请参见此处:

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

关于c# - 您如何看待我的 IDisposable 模式实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/706497/

相关文章:

javascript - 为什么外观模式+揭示模块化模式 "add security"?

c# - 如何在 .NET Core 2 中使用 ACL?

c# - 服务层分页,分页结果(逻辑放哪?)

c# - 如何在没有异常处理的情况下检查服务器是否正在监听

c# - System.Windows.Forms 中可用的事件序列和所有 Hook

php - PHP 单例设计模式中私有(private)构造函数的行为

c# - 使用 StackExchange.Redis 时出现错误 'WRONGTYPE Operation against a key holding the wrong kind of value'

c# - 正则表达式帮助 : My regex pattern will match invalid Dictionary

C# 正则表达式删除 C 风格注释并提取括号之间的文本

factory-pattern - 抽象工厂和工厂设计模式有什么区别?