rksoftware

Visual Studio とか C# とかが好きです

C# 12 の新機能の確認 「 インライン配列 」

そろそろ 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;
}