はじめに
こんにちは。山本れきです。
C#プログラマーの皆さんは最近のC#動向を追っていますか?そういったことを専門で扱っている有名サイトもありますが、C#の言語デザインを進めている GitHub の記事(議事録)を追いかけてみるのもちょっと面白いので、紹介したいと思いブログにしてみました。
C# Language Design (https://github.com/dotnet/csharplang)
ここはまさに、C#11以降の言語仕様を検討している公式の場所です。
最近の動向について
2022/6/30 時点で言語仕様への提案は500弱。その中には現実味を帯びたものもあれば、まだまだ検討を要するものもあります。この記事においてはかなり主観的に、私個人が欲しいと感じたものや興味深いと思ったものについて列挙してみたいと思います。
引数がnullの場合に自動的に例外を出す !!
という修飾
https://github.com/dotnet/csharplang/blob/main/proposals/param-nullchecking.md
1 2 |
void Foo(string name!!) { } |
この記述を以下のように展開するという案が採用されそうです。
1 2 3 4 5 |
void Foo(string name) { if (name is null) { throw new ArgumentNullException(nameof(name)); } } |
書き方については賛否がありそうです。属性でよかったのではないかと感じなくもありませんが、機能自体は欲しかったものです。
params Span<T>
https://github.com/dotnet/csharplang/issues/1757
Span<T>は実装されてからこれまで、いろいろな議論に晒されています。
この話はまだ進展中で、引数に params(不定長引数) を指定したときに配列ではなく Span<T> を受け取るメソッドがあったらそちらに引数を渡したら効率的ではないかという提案です。
しかし、長いSpan<T>を作られてスタックがあふれるのではないか。ループで使う場合に警告が必要ではないか。などいろいろな議論を呼んでいます。
パフォーマンスの観点ではぜひ実装してほしいですね。
UTF-8リテラル文字列を扱う方法
https://github.com/dotnet/csharplang/blob/main/proposals/utf8-string-literals.md
https://github.com/dotnet/csharplang/blob/main/meetings/2021/LDM-2021-10-27.md#utf-8-string-literals
これも古くからある問題で、世の中の多くが utf-8 になっている最中、C#は utf-16 のままでよいのかという議論です。当初はUtf8Stringでどうにかしようという話だったようですが、言語自体に組み込むべきという勢いはとどまらないようですね。現在有力な記述方法は以下のようなものになっています。
1 |
ReadOnlySpan<byte> hello = "hello"u8; |
コンパイラが外部ライブラリの実装に依存してしまうのではないかという懸念があるとのことです。
とはいえ、ひとまず組み込んでみてフィードバックを得てみようという流れに向かっているようにも読めます。
field キーワードによる自動フィールド実装
https://github.com/dotnet/csharplang/blob/main/proposals/semi-auto-properties.md
ソースジェネレーターでフィールドからプロパティを生やすというものとは逆の発想です。 field
キーワードはプロパティの暗黙のバッキングフィールドであるという考え方ですね。議論が進むと良いと思います。
1 2 3 4 |
int foo { get => field; set => field = value; } |
これによって、遅延評価プロパティや通知型プロパティを記述しやすくなると考えられます。
補完文字列内での改行を許可する
https://github.com/dotnet/csharplang/blob/main/proposals/new-line-in-interpolation.md
1 2 3 4 5 6 |
// 現在は1行で書ききらないとならない var v = $"Count: { foo.Where(each => each.IsVisible).Count() }"; // 今後このように書いてもよいのではないか var v = $"Count: { foo.Where(each => each.IsVisible) .Count() }"; |
これは悪影響がないので、すぐにでも欲しくなりますね。
まとめ
ここに書いたものはほんの一部です。まだ議論の途上というものも多いですが、あれば便利と思えるものも多いと感じます。
まとめサイトに頼るのも良いですが、たまに議論の現場を読んでみるのも面白いと思います。
これからのC#の発展にさらに期待したいところですね!