繁体   English   中英

与套接字一起使用块

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM