2010-05-14 69 views
1

可以在我的方法頂部實例化一個MemoryStream,對它做一堆東西,然後使用它?MemoryStream實例計時幫助

例如:

public static byte[] TestCode() 
{ 
    MemoryStream m = new MemoryStream(); 
    ... 
    ... 
    whole bunch of stuff in between 
    ... 
    ... 

    //finally 

    using(m) 
    { 
    return m.ToArray(); 
    } 
} 

更新代碼

public static byte[] GetSamplePDF() 
{ 
    using (MemoryStream m = new MemoryStream()) 
    { 
     Document document = new Document(); 

     PdfWriter.GetInstance(document, m); 

     document.Open(); 

     PopulateTheDocument(document); 

     document.Close(); 

     return m.ToArray(); 
    } 
} 

private static void PopulateTheDocument(Document document) 
{ 
    Table aTable = new Table(2, 2); 
    aTable.AddCell("0.0"); 
    aTable.AddCell("0.1"); 
    aTable.AddCell("1.0"); 
    aTable.AddCell("1.1"); 

    document.Add(aTable); 

    for (int i = 0; i < 20; i++) 
    { 
     document.Add(new Phrase("Hello World, Hello Sun, Hello Moon, Hello Stars, Hello Sea, Hello Land, Hello People. ")); 
    } 

} 

我的觀點是試圖重用建設字節碼。換句話說,構建任何類型的文檔,然後將其發送到TestCode()方法。

回答

2

從技術上講,這是可能的,但沒有意義。如果您真的想避免在代碼中使用「使用」語句,請直接撥打Dispose()

您應該將使用MemoryStream的整個工作放入using語句中。這保證了MemoryStream的Dispose方法將被調用,即使你在「之間的所有東西」代碼中收到異常。你現在擁有它的方式,異常會阻止你的MemoryStream調用Dispose()

處理的正確方法,這將是:

public static byte[] TestCode() 
{ 
    MemoryStream m = new MemoryStream(); 
    using(m) 
    { 
     // ... 
     // ... 
     // whole bunch of stuff in between 
     // ... 
     // ... 

    return m.ToArray(); 
    } 
} 

或者,更常見的形式:

public static byte[] TestCode() 
{ 
    using(MemoryStream m = new MemoryStream()) 
    { 
     // ... 
     // ... 
     // whole bunch of stuff in between 
     // ... 
     // ... 

    return m.ToArray(); 
    } 
} 
1

當看到這樣的問題,我常常在想,如果我們不會有使用Java模型更好。 .NET程序員對這個可怕的IDisposable有很大的痛苦。在數以千計的關於SO(等)的問題之後,它仍然很難理解。

這是一個內存流。當你使用內存時,沒有什麼東西需要處理,垃圾收集器已經處理了它。它不是某種特殊的內存,只是因爲類有一個Dispose()方法,只有一種。另一種是由UnmanagedMemoryStream包裝的。 MemoryStream從Stream中繼承Stream的Do-nothing Dispose()方法的事實是令人難過的OOP責任。

由你決定怠慢地叫做無所事事的方法,因爲它在那裏。或者你可以負責你的代碼,並拒絕調用你知道現在沒有做任何有用的方法,也不會爲你的其他職業做任何有用的事情。顯然我在第二陣營,我們的預期壽命一定會更好。無論如何,我希望。然後,這篇文章可能會讓你休息一天。

+0

對於有效的咆哮+1。雖然我認爲在這種情況下好的超重是不好的。 – 2010-05-14 21:49:40