モジュール初期化子
概要 Ver. 9 プログラムの実行時、最初に1回だけ呼び出したい処理が必要になることがあります。 「静的コンストラクター」で説明しているように、この静的コンストラクターという機能を使っても「最初に1回だけ呼ばれる」ということができますが、C# 9.0 ではモジュール初期化子という書き方もできるようになりました。 モジュール初期化子...
View Articleレコード型
概要 C# 9.0 で、レコード型(records)という新しい種類の型が追加されました。 record (記録)という名前通り、データの読み書きに使うことを意図した型です。 例えば以下のような書き方で、「Name という文字列と Birthday という日付」を読み書きできます。 using System; record Person(string Name, DateTime...
View ArticleC# 10.0 の新機能
Ver. 10.0 ※ 2021/7/24 現在、プレビュー版です。 リリース時期 2021/? 同世代技術 .NET 6.0 Visual Studio 2022 要約・目玉機能 執筆予定: C# 10.0 トラッキング issue
View Article[雑記] コンパイル結果に影響を及ぼす属性
概要 「属性」の説明を「動的な処理」に並べているように、 多くの場合(特に属性を自作する場合)、 属性はリフレクションを使って実行時に型情報から読みだして使うものです。 (動的な処理自体、うちのサイト内では結構後半での説明なので、属性自体についての説明も後々になります。) ところが、いくつかの属性は C# コンパイラー自体が解釈して、 コンパイル結果に影響を及ぼします。 予約属性...
View ArticleC# 10.0 の補間文字列の改善
概要 Ver. 10 C# 10.0 で、補完文字列(interpolated string)のコンパイル結果に変更が掛かって、 これまでよりもかなり高速化されました。 詳細は気にせず単に高速化の恩恵だけを受けたい場合、 言語バージョン、SDK バージョンを C# 10.0/.NET 6.0 にアップデートして再コンパイルするだけで速くなります。 一方、本項では、 C# 9.0...
View ArticleC# 11.0 の新機能
Ver. 11.0 ※ 2022/5/4 現在、プレビュー版です。 リリース時期 2022/? 同世代技術 .NET 7.0 要約・目玉機能 執筆予定: C# 11.0 トラッキング issue その他 ジェネリックな属性 属性をジェネリック クラスにできるようになりました。 // 属性クラスをジェネリックにできるように。 class TypeConverter<T> :...
View Article【Generic Math】 C# 11 での演算子の新機能
概要 Ver. 11 C# 11 で、数値型の演算子関連で3つ新機能が追加されています。 符号なし右シフト checked 演算子オーバーロード シフト演算子の右オペランドの制限撤廃 背景: Generic Math C# 11 / .NET 7 でインターフェイスの静的メンバーを仮想・抽象にできる (static abstract members in interfaces)ようになります。...
View Articlefile ローカル型
Ver. 11 C# 11 で、file という修飾子を使って「書いたファイル内からだけアクセスできる型」を作れるようになりました。 これを file ローカル型 (file-local type)と言います。 例えば、あるファイルに以下のようなコードを書いたとします。 1.M(); file static class Extensions { public static void M(this...
View Article関数ポインター
概要 Ver. 9 関数ポインターとは、メモリ上でメソッドなどの命令列が入ってるアドレスを指すポインターで、 「そのアドレスにジャンプすることでメソッド呼び出しが実現されている」みたいなものです。 .NET の内部的にはこれまでも関数ポインターがあったんですが、 それを C# から効率的に呼ぶ手段がありませんでした。 これに対して、C# 9 では delegate*...
View Article[雑記] 明確な代入ルール
概要 C# には「明確な代入(definite assignment)ルール」と呼ばれる、未初期化変数を避ける仕組みがあります。 未定義動作問題 大昔のプログラミング言語では、 変数に対して誰も何の値も代入していないことで、不定な値が返ってくるということがありました。 不定な値が得られてしまうことで、未定義な動作になります。...
View ArticleC# 12.0 の新機能
Ver. 12.0 ※ 2023/6/21 現在、プレビュー版です。 リリース時期 2023/? 同世代技術 .NET 8.0 執筆予定: C# 12.0 トラッキング issue プライマリ コンストラクター 通常のクラス、構造体に対してプライマリ コンストラクターが使えるようになりました。 class A(int x) { public int X { get; } = x; }...
View Article[雑記] InlineArray
概要 Ver. 12 .NET 8 で、 InlineArray 属性 (System.Runtime.CompilerServices 名前空間) というものが入りました。 基本的には .NET ランタイム側の機能ですが、 いくつか、C# 側にもこの InlineArray 向けの特殊対応が入っています。 ちなみに、この機能は現状、 コレクション式の内部実装にこそ使っていますが、...
View Articleコレクション式
概要 Ver. 12 C# 12 で、[] 記号を使って配列などの初期化ができるようになりました。 配列だけではなく、コレクション(List<T> 型など)、Span<T> なども全く同じ書き方で初期化できます。 これをコレクション式(collection expression)と言います。 using System.Collections.Immutable; int[]...
View ArticleC# 13.0 の新機能
Ver. 12.0 ※ 2024/7/6 現在、プレビュー版です。 リリース時期 2024/11 同世代技術 .NET 9.0 執筆予定: C# 13.0 トラッキング issue その他 \e (エスケープ文字のエスケープ シーケンス) 文字・文字列リテラル中のエスケープ シーケンスに \e (U+001B、エスケープ文字)が追加されました。 例えば、コンソール...
View Article型の分割定義 (partial)
概要 Ver. 2.0 C# 2.0 で、partial 修飾子を付けることで、クラスや構造体、インターフェイスを複数のファイルに分けて型を定義できるようになりました。 この partial によるファイルの分割は、 「片方のファイルを手書き、もう片方のファイルを開発ツールなどによって自動生成」みたいな状況を想定しています。...
View Article