以前、Unityの公式ドキュメントを通して読んでみて(以前の記事はコチラ)、結構学びがあったので、今回はC#言語そのもののドキュメントを読んでみたいと思います。
実際に読んだのは、こちらページです。
https://learn.microsoft.com/ja-jp/dotnet/csharp/tour-of-csharp/overview
サイトの構造が分かりにくいのですが、サイドバーの「はじめに」~「C#プログラミングガイド」まで、ざっくりと目を通しました。
ただし、Unityドキュメントで既に読んだことが大部分で、それ以外の部分はUnityではまだ扱えなかったりするので、業務上の収穫は少なめでした。
面白いなと思った部分を下記に共有したいと思います。
1.Delegateの設計ミス
・対象ページ:System.Delegate と delegate キーワード
Delegeteとは、ごく簡単に言うと、関数を保存しておける変数のようなもの(私訳)
C#では関数を1つ保存できるDelegeteと、複数同時に保存できるMulticastDeleteが明確に区別されて設計されていますが、プログラミングの実用上、この2つは曖昧になってきたらしいです。
そこで下記の一言。
この区別は、実際には当初考えていたよりも役に立たないことがわかりました。
これは脆弱性を生んだりするような設計ミスではありませんが、公式ドキュメント上に間違いを認めるような文言が載っている、というのは珍しい感じがして、ちょっと面白くないですか?(私だけ?)
2.パターンマッチング
・対象ページ:パターンマッチング
「あ、これ使いたいかも」と直感的に感じた機能。
※誤解を生みやすい名前ですが、Regex.Match()とは別物です。
公式の例はコードコチラ
if条件がかなり口語的で分かりやすく、nullチェックをしながら数値に変換できる、と凄く使いやすそうな感じがします。
そしてそれを使ったSwitch文がコチラ
めちゃめちゃ見やすくないですか?
いちいちbreak;を書かずに、処理の分岐を羅列できる。
まさにSwitch文の「ブレークスルー」やぁ~(古い)
3.レコード
・対象ページ:レコード
レコードとは、DBのデータのようなものを扱いやすいように、少し機能を加えた特殊なクラスです(私訳)
classの代わりにrecordとし、宣言すると、
それだけで、下記のボイラープレートコードを勝手に実装したクラスが出来上がります。
・Equals()
・GetHashCord()
・すべてのプロパティを引数にしたコンストラクタ
レコードはC#9.0で実装された機能のため、Unity目線では新しい技術です。
C#10で機能追加されてレコード構造体がサポートされたりと、進化を残している部分もあります。
(現在のUnityはC#9.0まで対応)