簡體   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