【C#】CSharpierのすすめ
C#フォーマッタであるCSharpierがとても良かったので、そのおすすめ記事です。CSharpierはいいぞ。
dotnet-format
当然ですが、C#にもデフォルトのフォーマッタであるdotnet-formatが用意されています。これはプロジェクトの.editorconfigをベースに動作するフォーマッタになっていて、VSCodeのC#拡張機能などではこれが使われています。
これでもある程度は使えますが、そこまで強力ではありません。例えば以下のコードの場合。
class Program{
static void Main(){
int[] values=[1,2,3,4,5,6,7,8,9];
var result = values .Where(x => x%2==0)
.Select(x => x*x).Take(3)
.Select(x => x.ToString()).ToArray();
foreach (var item in result){
Console.WriteLine( item );
}
}
}
このコードに対してdotnet formatを実行すると以下のようになります。
class Program
{
static void Main()
{
int[] values = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = values.Where(x => x % 2 == 0)
.Select(x => x * x).Take(3)
.Select(x => x.ToString()).ToArray();
foreach (var item in result)
{
Console.WriteLine(item);
}
}
}
ある程度は綺麗になりましたが、空白行やメソッドチェーンに関してはあまり綺麗に整形されていません。また、パフォーマンスも良くはなく、フォーマットが完了するまでにそれなりの時間待たされることになります。
CSharpierを使う
CSharpierはサードパーティ製の高速なC#(XML)フォーマッタです。
名前の通りPrettierに影響を受けた設計思想を持っていますが、実装はRoslynのMicrosoft.CodeAnalysis.CSharpをベースに独自のフォーマット処理を実装したものになっています。
CSharpierはいわゆる「意見の強い(opinionated)」フォーマッタです。カスタマイズ出来る部分は最小限にとどめられており、コードスタイルの差が生じないように強制力の高いフォーマットを行います。これは最近のフォーマッタのトレンドで、gofmtなども同様の思想で設計されています。
早速インストールしていきましょう。CSharpierはNuGetで配布されているため、dotnet install経由で入手できます。
$ dotnet tool install csharpier -g
インストールしたら以下のコマンドで実行できます。これを使って先ほどのファイルをフォーマットしてみましょう。
$ csharpier format .
結果は以下の通り。
class Program
{
static void Main()
{
int[] values = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = values
.Where(x => x % 2 == 0)
.Select(x => x * x)
.Select(x => x.ToString())
.Take(3)
.ToArray();
foreach (var item in result)
{
Console.WriteLine(item);
}
}
}
空白行やメソッドチェーンの部分も含め、綺麗に整形されています。またパフォーマンスもかなり練られており、高速なフォーマットが可能になっています。
設定周り
フォーマットのカスタマイズは.csharpierrcファイル(JSON/YAML)で行えるほか、.editorconfigに対応しています。
printWidth: 100
useTabs: false
indentSize: 4
endOfLine: auto
ただし、CSharpierはデフォルトの設定でいい感じにフォーマットしてくれるので、基本的には必要ないはずです。
IDEでCSharpierを使う
CLIだけでなく、IDE向けの拡張機能も提供されています。コードの保存時にCSharpierを実行したい場合はこちらも併せてインストールしておきましょう。
まとめ
というわけでCSharpierの紹介でした。正直dotnet-formatのフォーマットにはかなり不満があったので、良いフォーマッタが使えるようになって満足です。CSharpierはいいぞ。
Discussion