そろそろ C# 12 の時期なので予習を始めなければなりません。
今回は 「 インライン配列 」 を確認してみましょう。
■ インライン配列
learn.microsoft.com
N 個の要素を持つ構造体を作れる。配列のように添え字アクセスできる。
配列と違って Linq が使えない。System.Span<T> に代入できる。
using System.Reflection; var buffer = new Buffer(); // 配列のように添え字アクセス可能 for (int i = 0; i < 10; ++i) buffer[i] = i; foreach (var i in buffer) Console.WriteLine(i); // サイズ unsafe { Console.WriteLine(sizeof(Buffer)); Console.WriteLine(sizeof(Buffer20)); } // 40 80 // 長さを取得 // 型 Buffer の長さは 10 です // 型 Buffer20 の長さは 20 です Console.WriteLine($"型 {typeof(Buffer)} の長さは {((System.Runtime.CompilerServices.InlineArrayAttribute?)typeof(Buffer).GetCustomAttribute(typeof(System.Runtime.CompilerServices.InlineArrayAttribute)))?.Length} です"); Console.WriteLine($"型 {typeof(Buffer20)} の長さは {((System.Runtime.CompilerServices.InlineArrayAttribute?)typeof(Buffer20).GetCustomAttribute(typeof(System.Runtime.CompilerServices.InlineArrayAttribute)))?.Length} です"); // System.Linq.Enumerable.Select(buffer, i => Console.WriteLine()); // これはできない。IEnumerable<T> を実装していない // Span<T> に代入可能 System.Span<int> span = buffer; // System.Span<int> span2 = new Buffer(); // これはエラー「 エラー CS9164 式は割り当て可能な変数ではないため、'Span<int>' に変換できません 」 Buffer20 b20 = new(); System.ReadOnlySpan<int> rospan = b20; Console.WriteLine($"型 {typeof(Buffer)} の長さは {span.Length} です"); // 型 Buffer の長さは 10 です Console.WriteLine($"型 {typeof(Buffer20)} の長さは {rospan.Length} です"); // 型 Buffer20 の長さは 20 です // インライン配列の宣言 [System.Runtime.CompilerServices.InlineArray(10)] public struct Buffer { private int _firstElement; } [System.Runtime.CompilerServices.InlineArray(20)] public struct Buffer20 { private int _firstElement; }