C# 9.0 の確認の目次はこちら
■ localsinit フラグの出力を抑制する
ドキュメントはこちら
パフォーマンスと相互運用 という項目の 4 つめの塊の 「最後に、」 から始まるブロックです。
この属性がついている場合、ゼロ初期化がなされずパフォーマンスが向上する場合があるそうです。
■ コード
unsafe が許可されている場合のみ使えます(unsafe の中に書く必要はありません)。
例えばこんなコードです。
[System.Runtime.CompilerServices.SkipLocalsInit] unsafe static void Main(string[] args) { int i; int* j = &i; Console.WriteLine(*j); }
この属性は モジュール, クラス, 構造体, コンストラクター, メソッド, プロパティ、インデクサー, イベント, インターフェイス でのみ有効だそうです。例えばフィールドにつけようとすると次のエラーになります。
エラー CS0592 属性 'System.Runtime.CompilerServices.SkipLocalsInit' はこの宣言型では無効です。'モジュール, クラス, 構造体, コンストラクター, メソッド, プロパティ、インデクサー, イベント, インターフェイス' 宣言でのみ有効です。
■ まとめ
ドキュメントに特に stackalloc
使用する場合、パフォーマンスが大きく向上するとあります。stackalloc
を使う場合、それはパフォーマンスが求められる場合であることが多いでしょう。必要が出たときにこの機能を思い出せるように備えましょう。