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);
}
}
(簡潔にするため、引数の検証は省略されています。)
これは、バイト配列の1つがゼロの長さでない限りうまく機能します。この場合、IndexOutOfRangeExceptionが発生します。
インデックスが配列の範囲外だった。
できれば大量の定型コードを記述せずに、またfixed
他のものに切り替えることなく、例外を防ぐにはどうすればよいですか?
安全でないメソッドは、長さがゼロの引数からの読み取りまたは引数への書き込みを行いません。