[英]using block with Socket
如果我写
using (Socket s = new Socket(/*...*/))
{
//...
}
右括号是否响起
s.Shutdown(SocketShutdown.Both);
s.Close();
s.Dispose();
或仅
s.Dispose();
?
(或者是其他东西 ?)
谢谢 !
using语句将调用IDisposable.Dispose
,仅此IDisposable.Dispose
。
using语句只是一个编译器技巧,使您可以更简洁地表达出,即使该块所包含的代码抛出并大致转换为以下内容,您也总是希望处置给定的对象
Socket s = new Socket(...)
try
{
// Code contained by the using... block here.
}
finally
{
s.Dispose();
}
以我的经验,using语句很少与Socket
类结合使用。 最典型的情况是,您只会调用Socket.Close
,而后者实际上会在内部调用Socket.Dispose
。
Close
调用在.NET中的Socket
类中Dispose
。 using块仅调用Dispose
。
但这并不意味着using块是无用的!
在.NET中, using块本质上只是尝试/最后的语法糖,其中在using语句中在实现IDisposable
接口的对象上调用Dispose
。 我在下面说明和解释了一些区别。
如下代码:
using (var socket = new Socket(/*...*/))
{
// operations
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
在编译时扩展为以下代码:
{
Socket socket = new Socket(/*...*/);
try
{
// operations
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
finally
{
if (socket != null)
((IDisposable)socket).Dispose();
}
}
您不仅可以获得免费的空检查,而且还为Socket
类的实例创建了一个额外的作用域。
最终,我建议在这种情况下使用using块 ,因为这样可以确保在抛出异常等情况下,在Socket
类的实例上调用Dispose
。
我可以想到在这种情况下使用using块会获得很多收益,而实际上没有损失。 另一方面,当不使用using块时,我会想到很多损失。
如果您查看ILSpy或Reflector.NET中的Socket代码,您将看到以下代码:
public void Close()
{
if (Socket.s_LoggingEnabled)
{
Logging.Enter(Logging.Sockets, this, "Close", null);
}
((IDisposable)this).Dispose();
if (Socket.s_LoggingEnabled)
{
Logging.Exit(Logging.Sockets, this, "Close", null);
}
}
本质上,调用Dispose()
是多余的。 调用Close()
就足够了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.