У меня есть код unsafe
C#, который нельзя изменить и который предоставляет такие методы:
static unsafe void Foo(
byte* a, int aLength,
byte* b, int bLength,
byte* c, int cLength,
byte* d, int dLength,
byte* e, int eLength);
Я вызываю эти методы следующим образом:
static void Bar(
byte[] a, int aOffset, int aLength,
byte[] b, int bOffset, int bLength,
byte[] c, int cOffset, int cLength,
byte[] d, int dOffset, int dLength,
byte[] e, int eOffset, int eLength)
{
fixed (byte* a_ = &a[aOffset])
fixed (byte* b_ = &b[bOffset])
fixed (byte* c_ = &c[cOffset])
fixed (byte* d_ = &d[dOffset])
fixed (byte* e_ = &e[eOffset])
{
Foo(a_, aLength,
b_, bLength,
c_, cLength,
d_, dLength,
e_, eLength);
}
}
(Проверка аргумента опущена для краткости.)
Это хорошо работает, если только один из массивов байтов не имеет нулевой длины. В этом случае я получаю исключение IndexOutOfRangeException.
Индекс находился вне границ массива.
Как я могу предотвратить исключение, желательно без написания большого количества шаблонного кода и без переключения с fixed
на что-то другое?
Небезопасные методы не читают и не записывают аргументы, длина которых равна нулю.