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