Visual Studioから Rider に乗り換えて
はじめまして、
応用技術部にてゲーム開発関連のツール開発を行っている常山と申します。
業務では主にC# + WPF を使ってデスクトップアプリケーション等の開発をしています。
今日は一部で根強い人気のある .NET 向けのプログラミング統合開発環境エディター(以下、IDE)であるRiderを紹介します。
Riderとは?
Resharperで有名なJetbrains社のC# 等の.NET 系言語を扱うためのIDE(有料)です。(この記事ではResharperの話題を多数出しますがそれについては詳解しません。)
名前の由来は [RE]sharper + [IDE] + [R] から来ており、その名の通りResharperの機能がビルトインされているIDEと考えてもらえれば概ね大丈夫です。また、マルチプラットフォームなのでMaxOSからでも利用できます。
.NET以外ではUnityやUnrealEngine(2021年1月現在 Preview版)などのゲームエンジンでも利用できます。UnrealEngineではC++のサポートがされています。
.NETの進化にも過敏で .NET Coreはもちろん、 .NET 5 や C# 9.0 のサポートもされています。
Riderを導入した経緯
本題に入りますが、私の担当しているプロジェクトのソリューションファイルはC# の.csprojファイルがおよそ250あり、.csファイルを始めとしたソースコードファイルは5000ファイルを超えます。
元々は VisualStudio2019 + ReSharperで開発していましたが、扱うプロジェクトが多いとVisualStudioでは以下の問題が多発していました。(皆さんも経験ありませんか?)
インテリセンスが壊れる、IDEのフリーズ、長すぎる無応答時間…etc
特にResharperを有効にしていると問題が顕著に発現します。(この段落のトップにある画像もResharperによるものです。)
それなら、Resharperを利用しなければ解決するのでは?とお思いになられたかもしれませんが、この規模のプロジェクトではIDEが多少重くなってでもResharperによるコード補完機能やリファクタリング機能が使えないのはそれ以上に生産性を落としてしまうので機能を無効にする選択肢はありません。
… はい、そうなんです。Resharperの機能をそのままにIDEの応答性を劇的に向上させることができるのがRiderなのです。
続いてはVisualStudioとの比較をしてみます。
VisualStudioとの比較
機能対応表はこちら
https://www.jetbrains.com/rider/compare/rider-vs-visual-studio/
細かいところは上記リンクを見てもらうとして、私がここ1年ほどRiderを開発で利用してみて良かった点・逆に不便だと感じた点を以下にまとめてみました。
◎ シンボル検索が爆速
◎ ツール起動中にブランチ等切り替えても安定
◎ 名前空間や型の提案機能が素晴らしい
◎定義参照でdllのデコンパイル・ステップイン実行ができる
〇 ビルドに利用するMSBuildを簡単に切り替えれる
〇 シンプルな操作で複数のアプリケーションを同時デバッグできる
〇 リファクタリング機能が強力なので気軽に名前変更ができる
〇 プロファイラはdotTraceがビルトインされている
〇 nugetパッケージマネージャのGUIが早くて使いやすい
×ツール起動から触れるまでの時間が長い
× .resxから生成される自動生成ファイルのコメントが英語固定
× WPFではxamlのホットリロードができない(xamarinはできる)
× .NET Frameworkで作ったデスクトップアプリの標準出力が機能しない
ざっとこんな感じですが、全体的にパフォーマンスや機能面に関しては兼ね満足しています。一方、レガシーな.NET環境(.NET Framework , WPF 等)に対してのサポートが弱いなあという印象を受けました。業務ではまだまだ古いテクノロジーも利用しているのでこの辺りは改善されることを切に願います。
おすすめ機能
機能自体は ReSharperと被っていますが素晴らしいものが多いのでいくつか紹介します。
候補の提案・名前空間自動挿入
Riderでは参照可能なアセンブリにあるクラスを入力時に自動ですべて候補でだしてくれます。
そして、確定時に名前空間が不足している場合は自動的に追加してくれます。
これに慣れてしまうと普通のVisualStudioには戻れないです。
もちろん、nugetを使った外部ライブラリを利用している場合も提案・自動的な名前空間の挿入が可能です。
例えば次の様に名前空間に参照が不足している場合
Alt + Enter で適切な名前空間が自動的に挿入されます。
リファクタリング(名前変更)
以下の様なクラスがあったとします。
基底のWordクラスがあり、それを継承しているクラスや参照しているクラスが多数あります。このような時に基底クラスの名前を変更するのは影響範囲も大きく躊躇しますよね?
このWordクラスにカーソルを合せて Ctrl + R + R で 名前変更をしてみます。
Word から Textへの名前変更完了しました。
驚くことに継承先の型はもちろん、クラスの名前、ファイル名や一部のメンバー名も統合性を保ってくれています。
ファクトリメソッドにクラス名が含まれている場合、メンバー変数名が基底クラス名の前方一致 or 後方一致による名付けがなされていない場合は名前が変更されていません。
とはいえ、継承先クラスが外部ファイルにある場合、外部ファイルの名前も同時に変更してくれるのはとても便利です。(画像の例だと 外部ファイルのWordC.cs が TextC.csに変更されている箇所)
ライブラリのデコンパイル・デバッグ
Riderではユーザーアセンブリ以外のライブラリ(フレームワーク内のSystem空間、nugetによる外部参照dll等)をデコンパイルし、更にブレークポイントの設置することができます。
たとえば、StingBuilderに合わせて`F12`で定義へ移動+デコンパイル します。
これにより完全ではないですが、人間の読めるレベルでコードが復元されているので内部実装等を調べることができます。
更に、デコンパイルしたソースコードにブレークポイントを貼ってデバッガで待ち受けるといった芸当もできます。
最後に
これだけRiderを押してたのですが、リソース編集、xamlデザイン調整、ライブビュジュアルツリーを使ったデバッグ、C#以外の言語、などはまだまだVisualStudioを利用しております。しかし普段の開発では80%以上Riderに移行し、従来より作業効率が上がっているのを実感できています。
気になった方は30日の評価版があるので是非試してみてください。
本当はもう少し便利機能の数々も掘り下げて紹介もしようと思ったのですが、長くなってしまうので今回は割愛させていただきました。また機会があれば書いてみたいと思います。ここまでお読みいただきありがとうございます。