連載
» 2018年02月20日 05時00分 公開

Dev Basics/Keyword:Roslynator

Roslynatorは、C#コードの改善に役立つ多数のアナライザー機能およびリファクタリング機能を集めたVS用拡張機能。品質の高いコードの記述に役立つ。

[かわさきしんじ,Insider.NET編集部]
「Dev Basics/Keyword」のインデックス

連載「Dev Basics/Keyword」

 Roslynatorは、C#コードを改善する多数のアナライザー(コード分析)機能とリファクタリング機能を集めたVisual Studio(以下、VS)用拡張機能。その名の通り、Roslynを基盤とする。

Roslynatorでできること

 RoslynatorはVS 2015/2017用の拡張機能として提供されている(VS 2017では機能ごとに分割してNuGetパッケージとしても提供されている)。大ざっぱな機能としては、次の2つがある。

  • アナライザー
  • リファクタリング

 アナライザーでは190個以上のルールが定められており、それらのルールに従ってコードがVS上でリアルタイムに分析される。分析の結果、問題(ルールに沿っていないコード)が見つかればアナライザーから診断結果(Diagnostic)が返送され、問題があることがIDEに表示される。このとき、その問題を解決する修正案(Code Fix)があれば、どのように修正をすればよいかがプログラマーに提示される。

 Roslynatorにおいてアナライザーで定められているルールは「Roslynator Analyzers」ページで一覧できる。これらのアナライザーには「RCS」で始まるIDが割り当てられている。例えば、RCS1001というルールは「式が複数行に分けて書かれている場合には波かっこを付加する」というものだ(前述のページの[Category]欄を見ると、これはコーディングスタイルに関連するルールとなっている)。そこで、次のようなコードを書いてみよう。

int[] array = { 1, 2, 3, 4, 5 };
foreach (var item in array)
  Console.WriteLine(
  $"item: {item}");

foreachループの本体はConsole.WriteLineメソッドの呼び出し1つだけだが、それをあえて2行に分けて記述している

 VS 2017にRoslynatorをインストールしていると、RCS1001ルールに上記のコードが引っ掛かるので診断結果が報告され、[エラー一覧]ウィンドウに次のように「情報」として、波かっこを追加した方がよいと表示される。

Roslynatorによって表示された診断結果 Roslynatorによって表示された診断結果

 その他にも、ProgramクラスにはスタティックなMainメソッドしかないので、「Programクラスをスタティッククラスにするように」「ProgramクラスとMainメソッドにアクセス修飾子を付けるように」「argsパラメーターが使われてないよ」といったメッセージも表示されている。これらも[コード]欄を見ると「RCS」で始まるIDが割り当てられているので、Roslynatorが問題があると判断したコードであることが分かる。「Programクラスをスタティッククラスにするように」だけはレベルが「警告」となっているので、エディタにも波線で「問題があること」が示されている。それ以外は「情報」なので、エディタには特に示されていないが、[エラー一覧]ウィンドウには問題が報告される。

 「Console.WriteLine」行にカーソルがある状態で[Ctrl]+[.]キーを押すか、電球アイコン([クイック操作]アイコン)をクリックすると、次のように修正案が表示される。

提示されたCode Fix 提示されたCode Fix

 このようにRoslynatorのアナライザーはC#で記述したコードを分析し、さまざまな観点(コーディングスタイル、冗長性、可読性など)から問題を報告してくれる。

 一方のリファクタリングは、プログラマーの必要に応じて特定の範囲のコードに対するリファクタリング案を提示してくれる。リファクタリング機能を呼び出すには、任意のコード位置で[Ctrl]+[.]を押したり、電球アイコンをクリックしたりする。例えば、以下のようなコードを書いたとする。

int[] array = { 1, 2, 3, 4, 5 };
foreach (var item in array)
  if (item % 2 == 0)
    Console.WriteLine($"even: {item}");
  else
    Console.WriteLine($"odd: {item}");

配列要素の奇偶で出力するメッセージを変更するコード

 このコードを書き、if節あるいはelse節の本体にカーソルがある状態で[Ctrl]+[.]キーを押すと、次のようにリファクタリング候補が表示される(どのようなリファクタリング候補が表示されるかは、カーソル位置や範囲選択に応じて変わるので、興味のある方は実際にRoslynatorをインストールして試してみてほしい)。

リファクタリング候補「Add braces to if-else」が表示されたところ リファクタリング候補「Add braces to if-else」が表示されたところ

 一番上の「Add braces」は「foreach文に波かっこを加えた方がよい」という「RCS1001」からのメッセージおよびCode Fixだ。その下に「Add braces to if-else」などのリファクタリング候補が表示される(Code Fixはリファクタリング候補よりも優先してメニューの上部に表示されるようになっている)。

 Roslynatorが提供する全てのリファクタリング機能は「Roslynator Refactorings」ページで一覧できる。これらのページを見ると、一部の機能についてはデフォルトの状態では有効となっていないことが分かる。

Roslynatorの構成

 Roslynatorのアナライザー機能とリファクタリング機能にはデフォルトで有効化されているものとそうではないものがある。アナライザー機能の有効/無効を切り替えたり、レベルを情報/警告/エラーなどを個別に設定するには、ルールセットのカスタマイズを行う必要がある。これにはソリューションエクスプローラーで[参照]の下にある[アナライザー]を右クリックして、コンテキストメニューから[アクティブなルール セットを開く]を選択し、エディタ画面にルールセットを表示する。以下は、[グループ化]ドロップダウンで[アナライザーID]を選択し、Roslynatorで定められているルールを表示したところだ。

アナライザーIDでグループ化することで、Roslynatorが提供するアナライザーをまとめて表示できる アナライザーIDでグループ化することで、Roslynatorが提供するアナライザーをまとめて表示できる

 左端のチェックボックスがオンになっているのが、有効化されているルールである。また、[操作]欄にある[情報]などは、それをどのように扱うのかを示している。RCS1001は有効化されていて、[情報]となっているので、最初に見た複数行にまたがるConsole.WriteLineメソッドの呼び出しが「情報」として[エラー一覧]ウィンドウに表示されたというわけだ。

 リファクタリング機能の有効/無効の切り替えは[オプション]ダイアログから行う([ツール]メニューの[オプション]を選択)。なお、このダイアログではCode Fixの有効/無効の切り替えもできる。

[オプション]ダイアログ [オプション]ダイアログ

 Roslynatorが提供するアナライザー機能やリファクタリング機能を、自分たちのプロジェクトに合わせたものに変更することで、より適切なコード記述がはかどるようになるはずだ。


 Roslynatorは、C#コードの改善に役立つ多数のアナライザー機能およびリファクタリング機能を集めたVS用拡張機能であり、より適切、より可読性の高い、冗長度の低いコードの記述に役立つ。

参考資料


「Dev Basics/Keyword」のインデックス

Dev Basics/Keyword

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。