VSCode で C# のブロック {} 前後の改行の設定を変更する 2023

Pocket

本記事は 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 で C# のブロック {} 前後の改行の設定を変更する 2023」への1件のフィードバック

  1. ピンバック: VSCode + MinGW-w64 via MSYS2 で WIN32API の Unicode ビルド | Aqua Ware つぶやきブログ

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください