2009-02-26 47 views
17

如果我有一個字節數組創建byte [] binBuffer = new byte [256]並填充100個字節的數組,如果我想只傳遞這些100字節到其他方法,是否有可能做到這一點,而不需要創建一個100字節的新字節數組,從舊數組複製到新數組,然後傳遞新數組?有什麼我可以通過前100個字節。我的應用程序特別適用於將數組傳遞給存儲過程。使用字節數組的一部分

回答

2

如果你可以使用LINQ:

SomeMethod(binBuffer.Take(100)); 
+0

我懶得檢查 - 但這真的不只是將數組複製到一個大小爲100的新數組? – 2009-02-26 04:28:08

+0

同意安德魯。這應該重新檢查。 – 2009-02-26 04:30:40

1

,如果你使用的是.NET 3.5,你可以使用採取()擴展方法並執行以下操作:

class Program 
{ 
    static void Main(string[] args) 
    { 
     byte[] b = new byte[1000]; 

     dowork(b.Take(10).ToArray()); 

    } 

    public static void dowork(byte[] b) 
    { 
     // do some work 
    } 
} 
1

當一個數組傳遞對一個方法來說,只有對它的引用才被實際傳遞,因爲數組實際上是引用類型。你基本上有一個指向數組的指針,然後方括號中的偏移量只是告訴你離開始有多少「槽」。因此,唯一真正的做法是將兩個參數傳遞給你的方法。一個是實際的陣列,第二個是最大數量,直到你需要去的地方,在你的情況下它會是100.在那個方法中,你只能遍歷數組,直到達到最大數量。

18

與緩衝器工作時,一個很常見的模式是:

Foo(byte[] data, int offset, int count) {...} 

模式。但是,不能將其與SqlCommand /參數一起使用,因爲分配給參數時會佔用整個緩衝區。你將需要一個新的陣列:

byte[] second = new byte[100]; 
Buffer.BlockCopy(first, firstOffset, second, 0, 100); 
param.Value = second; 
2

簡短的回答是:沒有。你所做的任何事情(除了將數組本身作爲參數傳遞外)都將創建一個新數組並將其中的前100個字節複製。

但是,由於您不是按值傳遞數組,而是在傳遞它的引用,所以如果數組是256字節或100,爲什麼對您有影響?你不會浪費更多的記憶。不過,您可能需要告訴該方法使用多少數組,因爲Length方法將返回完整長度。

編輯:我剛剛意識到你想要傳遞數組到存儲過程。這將複製整個數組。您只需複製您想要傳遞的元素。

相關問題