簡體   English   中英

在using子句中的類上調用Close是有益,有害還是無謂的?

[英]Is calling Close on a class in a using clause beneficial, harmful, or moot?

在重構某些代碼時,我添加了一個“ using”語句,如下所示:

using (SerialPort serialPort = new SerialPort())
{
    serialPort.BaudRate = 19200;
    serialPort.Handshake = Handshake.XOnXOff;
    serialPort.Open();
    serialPort.Write(cmd);
    serialPort.Close();
}

...但是現在想知道我是否可以還是應該取消對Close的調用。 我認為是這樣,但這僅是一件精美的東西(風格要點)還是真正的必要?

它確實取決於類,並且作者是否正確地按照推薦實現的IDisposable實現了該類,並且讓Close除了調用Dispose()什么也沒有做。 在這種情況下, Close()調用是多余的,並且在將類包裝到using塊中時可以將其刪除。

通常來說-在此特定情況下,使用SerialPort可以做到這一點,因此Close()調用是多余的,可以刪除。

這實際上取決於實現IDisposable的特定類。 對於實現IDisposable NOT的,寫得不好的類,完全有可能完全釋放資源並關閉連接。 在SerialPort類的特定情況下,文檔指出Close()調用Dispose()。 我認為在這種情況下,應該將其放在using塊中,而不要手動調用Close()。

根據里希特:

提供確定性處置或封閉能力的類型將實施處置模式。 處置模式定義了開發人員在定義要向該類型的用戶提供顯式清理的類型時應遵循的約定。

SerialPort定義了打開和關閉,意味着它可以在其生命周期內多次打開和關閉,這與它的處置是互斥的(例如,不再使用)

但是回到您的原始問題,是的-在這種情況下,它是多余的,對SerialPort對象的反編譯揭示了調用時dispose為您關閉了端口:

protected override void Dispose(bool disposing)
{
  if (disposing && this.IsOpen)
  {
    this.internalSerialStream.Flush();
    this.internalSerialStream.Close();
    this.internalSerialStream = (SerialStream) null;
  }
  base.Dispose(disposing);
}

如果在Dispose出現異常情況,通常讓Dispose拋出異常要比無聲地完成拋出更好(在任何特定情況下抑制異常是否更好,將取決於異常是否已經掛起,並且還沒有機制)通過Dispose可以知道是什么情況。 因為沒有很好的方法來處理Dispose的異常,所以通常最好確保在調用Dispose之前,如果有可能在Dispose完成可能會出錯的任何操作。

如果“ Dispose是正常情況下唯一的清除方法,則將其扼殺異常將帶來可能發生問題但未被發現的重大風險。 擁有一個同時支持Closeusing的類,並讓客戶在主線情況下調用Close可以降低這種風險(如果一個異常待處理,則Dispose將在不使用Close情況下被調用,因此清除時的任何異常都將得到令人窒息,但代碼將知道由於掛起的異常而導致某些地方出錯;如果在Close之前未發生任何異常,則在Dispose清理上下文中未對其進行調用的事實將意味着它可以假定沒有異常掛起,因此可能安全地拋出自己的一個)。

DisposeClose的異常處理實踐並不一致,但是我建議原則上調用Close 根據DisposeClose的實現方式,在隱式Dispose之前顯式調用Close可能有用也可能沒有幫助,但在最壞的情況下應該無害。 考慮到它可能會有所幫助的可能性(如果不是在當前的課程版本中,或者在將來的版本中),我建議您將其作為一般習慣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM