gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:50:22 27 4
gpt4 key购买 nike

您如何看待以下 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com