というわけで 備忘録的な話ですが、C# の 配列へのアクセス時に 範囲外のアクセスをすると IndexOutOfRangeException
が発生してアクセスできません。
ただ、配列から Span<T>
が取れる為、範囲の外にアクセスする方法が無いわけでもないのです。
というのが、今回の趣旨です。
この記事は ReadOnlySpan<T>
から Span<T>
を取得したり、配列から範囲外を含む Span<T>
を取得したりしていますが、それを推奨する記事ではないです。
そういう手段が存在するというのを伝える為の記事です。
やってみる
using System;
using System.Runtime.InteropServices;
int[] array = [1,2,3,4,5];
var span = MemoryMarshal.CreateSpan(ref MemoryMarshal.GetReference(array.AsSpan()), 10);
Console.WriteLine(string.Join(',', span.ToArray()));
output
1,2,3,4,5,0,0,0,-39468856,32760
配列の範囲である length:5 以降にもアクセスできてしまっており、 未初期化領域にもアクセスが特にエラーなくできています。
以上。