2009-02-26 56 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方法将返回完整长度。

编辑:我刚刚意识到你想要传递数组到存储过程。这将复制整个数组。您只需复制您想要传递的元素。

相关问题