本記事は C# Advent Calendar 2023 の2日目の記事だ。
1日目は @RyotaMurohoshi 氏の 【Allって】LINQ、この場合どうなる?【空配列は?】 #C# - Qiita だった。
以前バズった空配列議論のツイートを例に、 .NET の LINQ の各エッジケースでどう振る舞うかまとめた記事になっている。
なかなかのボリュームで読み応えがある。
慣れていないと迷ったり勘違いしやすい話なので、参考になる。
C# を K&Rスタイル で整形したい
さて、 C# の既定のコードフォーマットでは、名前空間やクラス、メソッドなど、各種ブロックの {}
(中括弧・波括弧) の手前に改行が入る。(所謂、オールマンスタイル)
namespace MyNamespace
{
class Class1
{
static void Main(string[] args)
{
if (args.Length > 0)
{
;
}
else
{
;
}
try
{
;
}
catch
{
;
}
finally
{
;
}
}
}
}
言語の既定に従うのも悪くは無いとは思う。思うのだが、 Java, JavaScript, Go, Rust 等々、他のメジャーな C言語 スタイルの言語では、 Java のコーディング規約に則って改行を入れないの(K&Rスタイル)が一般的なので、 C# で改行を入れるこのコードスタイルはどうにも気持ちが悪い。(主張の強い個人の感想です)
手癖で改行を入れない書き方をしていても、 Shift+Alt+F
でドキュメントのフォーマットをすると改行されてしまう。
…と言うことで、 Visual Studio Code (VSCode) を使って C# の開発する際に、各種ブロックの {}
(中括弧・波括弧) の手前に改行が入らない形でフォーマットする方法を紹介する。
omnisharp.json
は機能しない
vscode でこの設定を変更する場合、古くは omnisharp.json
が使われていた。
ところが、 2023年中頃の VSCode の C# 拡張機能の更新 (v2.0.320) で、既定で Roslyn と Razor をベースとした新しい言語サーバーを利用するようになったため、 OmniSharp が使われなくなった。
このため、明示的に OmniSharp を有効 にしない限り、 omnisharp.json
に書かれた設定は機能しなくなっている。
.editorconfig
を使おう
新しい言語サーバーでは、 Visual Studio (非 VSCode) と同じく、 .NET コード スタイル ルール オプション - .NET | Microsoft Learn のルールに則った .editorcondig
ファイルを使う。
以降の手順は .NET SDK 6 以上がインストールされていることを前提とする。
既に EOL になっているので使っている人はいないと思うが、 .NET 5 だけでは機能しないので注意。
(.csproj
などで解決される .NET CLI コマンドのバージョンに寄るっぽい?)
まず、 VSCode に C# 拡張 をインストールする。
.cs
ファイルを開いた際にリコメンドされる C# Dev Kit 拡張 をインストールすれば、自動的に C# 拡張もインストールされているはずだ。
上述の Microsoft Learn の説明では、 EditorConfig for VS Code 拡張 のインストールが必要と書かれているが、こちらを入れる必要は無い。
プロジェクトのルートに .editorcondig
という名前のファイルを作成し、以下のような内容で保存する。
# CSharp formatting rules:
[*.cs]
csharp_new_line_before_open_brace = none
csharp_new_line_before_else = false
csharp_new_line_before_catch = false
csharp_new_line_before_finally = false
この状態で、 言語サーバーか VSCode 自体を再起動させ、暫く待ってからドキュメントのフォーマット (Shift+Alt+F
) を実行してみよう。
すると、以下のようにブロックの前後の余計なの改行が無い状態でフォーマットされるはずだ。
namespace MyNamespace {
class Class1 {
static void Main(string[] args) {
if (args.Length > 0) {
;
} else {
;
}
try {
;
} catch {
;
} finally {
;
}
}
}
}
おわりに
C# Advent Calendar 2023 の3日目となる明日は @neuecc 氏の記事が予定されている。
ピンバック: VSCode + MinGW-w64 via MSYS2 で WIN32API の Unicode ビルド | Aqua Ware つぶやきブログ