2012-07-03 5 views
3

У кого-нибудь есть опыт в преобразовании ref byte в byte[]?Как преобразовать байт в байты []?

Если функция принимает аргумент, как

void foo(ref byte buffer); 

то можно назвать foo использованием

void call_func() 
{ 
    byte arr[] = new byte[10]; 
    foo(ref arr[0]); 
} 

Вопрос заключается в том, как может один повторно преобразовать buffer аргумент в byte[] массив в foo.

+7

Если вам нужно передать массив, почему бы не передать массив? C# не C. – Vlad

+0

Вы уже должны отказаться от некоторых ваших привычек c/C++ ... –

+0

@khkarens: C++/CLI работает намного лучше, позволяя C# вызывать существующий код на C++, чем SWiG. –

ответ

8

У вас нет.

Чтобы избежать закрепления всего массива, среда выполнения может просто сделать копию выбранного вами элемента (а затем скопировать обратно после вызова). В этом случае ваша функция получит адрес временной копии, которая не связана с адресом других элементов массива. (Ну, there could be some aliasing considerations, эта оптимизация гораздо более вероятна для pinvoke и/или удаленных вызовов, где анализ сглаживания более возможен).

Если вам нужен массив, передайте массив.


Если вам все равно, что это может не сработать правильно, вы можете использовать небезопасный код для доступа к другим элементам.

pinned(byte* p = &buffer) { 
    buffer[4] = 0; 
} 
+0

+1, и вы испортите мозг любого, кто пытается отладить ваш код, если вы сделали –

+0

Спасибо @BenVoigt! Кажется, у меня есть причина, чтобы исследовать поведение swig (чтобы понять, почему выставляет ref sbyte вместо ref sbyte [] из unsigned char *). Объяснение ясно. – khkarens

+0

Бен, определение [ref] (http://msdn.microsoft.com/en-us/library/14akc2c7.aspx) в C# кажется противоречивым тому, что вы объяснили. Они говорят, что _ Эффект прохождения по ссылке заключается в том, что любое изменение параметра в методе отражается в основной переменной аргумента в вызывающем методе. Поэтому я не понимаю, как оптимизатор может выпустить идею ссылки и передать временное значение? – khkarens

Смежные вопросы