с использованием части байтового массива

Если у меня есть массив байтов, созданный byte [] binBuffer = new byte [256], и я заполняю 100 байтов массива, если я хочу передать только эти 100 байтов другому методу, возможно ли это сделать без создания новый байтовый массив из 100 байт, копирование из старого массива в новый, а затем передача нового массива? Есть ли как-нибудь я могу просто передать первые 100 байт. Мое приложение специально предназначено для передачи массива хранимой процедуре.

Ответов (5)

Если вы можете использовать linq:

SomeMethod(binBuffer.Take(100));

если вы используете .net 3.5, вы можете использовать метод расширения Take () и сделать следующее:

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
    }
}

Очень распространенный паттерн при работе с буферами:

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

шаблон. Однако вы не можете использовать это с SqlCommand параметром /, поскольку, когда вы назначаете параметр, он занимает весь буфер. Вам понадобится новый массив:

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

Когда массив передается в метод, фактически передается только ссылка на него, поскольку массивы фактически являются ссылочными типами. По сути, у вас есть указатель на массив, а затем смещение в квадратных скобках просто говорит вам, сколько «слотов» от начала. Следовательно, единственный реальный способ сделать это - передать вашему методу два параметра. Один - это фактический массив, а второй - максимальное число до того места, куда вам нужно перейти, в вашем случае это будет 100. В этом методе вы затем выполняете итерацию по массиву до тех пор, пока не будет достигнуто максимальное число.

Короткий ответ - нет. Все, что вы делаете (помимо передачи самого массива в качестве параметра), создаст новый массив и скопирует в него первые 100 байтов.

Однако, поскольку вы не передаете массив по значению, а вместо этого передаете на него ссылку, почему для вас важно, имеет ли массив 256 байтов или 100? Вы не тратите больше памяти. Однако вам может потребоваться указать методу, какую часть этого массива использовать, поскольку метод Length вернет полную длину.

РЕДАКТИРОВАТЬ: Я только что понял, что вы хотите передать массив хранимой процедуре. Это скопирует весь массив. Вам нужно будет сделать копию только с теми элементами, которые вы хотите передать.