VS2022 にしてから、いろいろ提案されるようになって、改めて知った C# の機能があります。読者の皆さんなら既知の内容ばかりかと思いますが、私にとっては「ほほーぅ」と思う事ばかりでした。今回はその話をします。


  • タプルによる変数のスワップ
C# に 7.0 以降の機能でスワップがある事を知りました。以下は昨年自分が実装したコードの抜粋です。

var tmp = Rsc.Stages[idx + 1]; Rsc.Stages[idx + 1] = Rsc.Stages[idx];
Rsc.Stages[idx] = tmp;
このコードに対して VS2022 は以下を提案してきました。それが、IDE0180 タプルを使用して値をスワップするという内容です。

(Rsc.Stages[idx], Rsc.Stages[idx + 1]) = (Rsc.Stages[idx + 1], Rsc.Stages[idx]);
一行がやたらと長くなるけど、表向きはテンポラリワークが見えなくなるので、今後はこちらの記述を使っていこうと思います。
※ 内部的にはテンポラリを作って同じ事をしているようです…


  • CPU依存型
nint とか nuint ってのがいつの間にか採用されていました。C# 9.0 からのようです。nint とは Native INT の略のようですね。CPU によって一番演算が得意なサイズで変数を用意するのでパフォーマンスが改善するようです。※ 正直分かりませんでしたが…

今は最低でも 32bit CPU は保証されているので、めっちゃんこ大きなサイズを扱わない限りは、 nint で記述してもそうそう問題は起こりにくいとは思いますが、明確に型サイズが決められているワケではないので、システム保全が必要な関連プロジェクトでは採用は難しそうです。

この nint を利用して、sizeof(nint) とする実行環境の CPU ビット数を把握する事も出来そうです。32bit CPU なら 4、64bit CPU なら 8 となると思います(未検証)。将来もし 128bit CPU なんて出たら、16 が返るんですかねw


  • 構造体のデフォルトコンストラクタ
C# 10 でようやく構造体に引数なしコンストラクタ(所謂デフォルトコンストラクタ)が記述できるようになったようです。今までなんで出来なかったのかと思うぐらいで、時々困ってました。構造体メンバを部分的に初期化したい事がたまにあるんです。挙げ句、struct の使用を諦めて class に置き換える事もしばしば。


  • プロジェクト全体に対する using 指定
global using なんてのが追加されました。どこかに一行書いておくと、プロジェクト全体に using が有効となります。…最初からプロジェクトを作るのなら便利なんでしょうけど、数十ものファイルに分割されている、ある程度大規模プロジェクトが進行中の場合は、これに置き換える方がめんどくさいですよね…。

あと、意図せずメソッド名やプロパティ名が衝突する事もあるかもなので、追加どころにはちょっとだけ注意が必要かもです。まあ、適切にエラーが出るみたいなので、大丈夫とは思いますが。

--

このように VS2022 では以前よりより適切に「こんなんありまっせ?」と提案してくれて、しかもそれが恐ろしい精度でだいたい合ってるから凄いです。おかげで C# の新機能を覚えて無くてもドカドカ提案されるので、次々使っていけます。

あまつさえ、プログラミングのタイピングの途中で「こう書きたいんちゃうん?」と提案してきて、これまた結構な確率で合ってて、後は [TAB]キーを押すだけとか、なんかもう少ししたら、こういうの作りたいって設計情報だけ入力したら、勝手にアプリが出来てしまう時代になってくるんじゃないかとまで思ってしまいます。本当に凄いですね。

PlayStation 2専用ネットワークアダプター (Ethernet) EXPANSION BAYタイプ
【広告】
ソニー・コンピュータエンタテインメント
2003-06-12

※ 内藤注
記事作成時に一つだけ在庫がありました。これ、MC2SIOより扱いが難しいです。かつ、機種を選びます。動作するゲームも選びます。動かせたら当然めちゃくちゃ速いです。私はサポートできません。
自己責任でどうぞw