2010-01-08 42 views
0

我知道這是主觀的,但,這是我想出了基於回答我剛纔的問題的結果,似乎有點「拼湊」,因爲我已經改了不少:這是用於從網絡流(vb.net)讀取的最佳代碼嗎?

Private Function ReadFromBuffer(ByVal objReader As NetworkStream) As Byte() 
    Dim intRead As Integer = 1024 
    Dim allBytes(-1) As Byte 

    While intRead = 1024 
     Dim byteTempbuffer(1023) As Byte 
     intRead = objReader.Read(byteTempbuffer, 0, 1024) 
     ReDim Preserve byteTempbuffer(intRead - 1) 
     Dim tempold(allBytes.Length - 1) As Byte 
     tempold = allBytes 
     allBytes = tempold.Concat(byteTempbuffer).ToArray 
    End While 

    Return allBytes 
End Function 

基本上有更好的方式來寫這個(甚至只是代碼的一部分)或更有效的方式來做到這一點?

基本上,代碼是一次讀取網絡流1024字節中的所有字節。每次它讀取它放入一個返回的數組中的字節。

我認爲可能會更好的事情只有Redim byteTempbuffer如果intRead小於1024(redim是爲了防止空的字節被添加到數組的末尾,當剩餘的1024字節從網絡流)(基本上每次都更加高效,或者只是在需要的時候才聲明和重定向)

+0

我認爲這屬於對codereview.stackexchange.com – finnw 2012-06-04 11:20:58

回答

2

這絕對不是最好的方法:在循環的每次迭代中,分配一個新的緩衝區,比前一個更大......這可能會給GC帶來很大的壓力。

如果你不知道數據的總長度,你可以使用一個MemoryStream

Private Function ReadFromBuffer(ByVal objReader As NetworkStream) As Byte() 
    Dim intRead As Integer = 1024 
    Dim byteTempbuffer(1023) As Byte 
    Dim allBytes As New MemoryStream 

    While intRead = 1024 
     intRead = objReader.Read(byteTempbuffer, 0, 1024) 
     allBytes.Write(byteTempbuffer, 0, intRead) 
    End While 

    Return allBytes.ToArray() 
End Function 
+0

謝謝你,我想有一個更好的辦法: ) – 2010-01-09 08:59:46