2013-04-17 38 views
2

如何在實現IDisposable的類的MemoryStream對象上使用「using」之後實現Dispose方法?使用C#處理 - 完全實現

public class ControlToByte :IDisposable 
{ 
    public static byte[] GetByte(object control) 
    { 
     using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream()) 
     { //do something here } 
public void Dispose() 
    { 
     //how do you dispose of memorystream object? 
    } 
+4

沒有任何跡象表明ControlToByte在這裏實現了IDisposable ......你並沒有在類中顯示任何狀態。 –

+0

在你發佈的代碼中,'using'將會處理'memoryStream',所以你不需要單獨的Dispose()。 –

+2

我不建議不處理'MemoryStream'(因爲它通過從'Stream'繼承來實現'IDisposable',因此表明它應該在不再使用時丟棄),但是因爲類沒有任何非存在的處理它的資源並沒有真正釋放任何東西。一個常見的誤解是認爲與「MemoryStream」相關聯的內存在釋放時釋放,但該任務留給垃圾收集器。 –

回答

6

您不必執行IDispose,也不必調用Dispose明確。 using區塊將確保完成後MemoryStream將被處置。 using塊實際上像try/finally塊一樣工作。喜歡的東西:

{ 
    System.IO.MemoryStream memoryStream = null; 

    try 
    { 
     memoryStream = new System.IO.MemoryStream(); 
     //....your code 
    } 
    finally 
    { 
     if (memoryStream != null) //this check may be optmized away 
      memoryStream.Dispose(); 
    } 
} 

using C#

using語句確保如果 發生異常,而你是調用對象的方法處置甚至被稱爲。您可以通過將對象放入一個嘗試塊 中,然後在finally塊中調用Dispose來獲得相同的結果;實際上,這是如何使用 的使用語句被編譯器翻譯的。

在你現在的代碼,你在你的ControlToByte類實現IDisposable,如果要處理資源的開發在ControlToByte這將是有益的。如圖所示,你不需要爲你的班級實施IDisposable

+0

@Jodrell,感謝編輯 – Habib

+0

好,但必須在某處實施Dispose,對吧?它在哪裏? @Habib – Paradigm

+0

@MPN,不需要。除非你想對'ControlToByte'實現Dispose。 'MemoryStream'已經實現了'IDisposable',using語句將確保它在MemoryStream對象上調用Dispose。你不必自己實現它。 – Habib