新しい C# プロジェクトを作成した時にやることリスト

新しい C# のソリューションまたはプロジェクトを作成した時にやることの個人メモを備忘録として纏めます。

使用するエディタは Visual Studio Code および Visual Studio 2022 を想定しています。

## バージョン情報

* .NET: 9.0.200
* Visual Studio Code: 1.97.2
* Visual Studio 2022: 17.13.2

## 新しいソリューションを作成した時にやること

ソリューションでやることはほぼ使いまわしが可能です。

1. EditorConfig ファイルの作成
1. スペルチェッカーの設定
1. コード分析規則の設定
1. 命名規則の設定
1. VSCode の設定

### EditorConfig ファイルの作成

何はともあれ EditorConfig ファイル ".editorconfig" を作成しておきます。
"*.cs" ファイルの `indent_size` 等を設定します。

### スペルチェッカーの設定

スペルミス（タイプミス）をチェックするためスペルチェッカーの設定をします。
VSCode では拡張機能 `streetsidesoftware.code-spell-checker` を、VS2022 では標準のスペルチェック機能を利用します。
ただしこの 2 機能に互換性はないため、せめて辞書ファイル（ホワイトリスト）だけ以下の通り共通化しておきます。

1. 空のテキストファイル "exclusion.dic" を作成します。
1. ".editorconfig" に以下の設定を追加して VS2022 スペルチェック機能の辞書ファイルを設定します。
    ```config:.editorconfig
    #### Visual Studio text spell checker ####
    [*]
    spelling_exclusion_path = ./exclusion.dic
    ```
1. 以下のJSON ファイル "cspell.json" を作成して VSCode 拡張機能（および CLI ツール `cspell`）の辞書ファイルを設定します。
    ```json:cspell.json
    {
      "version": "0.2",
      "language": "en",
      "ignorePaths": [
        "**/bin/**",
        "**/obj/**"
      ],
      "dictionaries": [
        "vs_exclusion"
      ],
      "dictionaryDefinitions": [
        {
          "name": "vs_exclusion",
          "path": "./exclusion.dic"
        }
      ]
    }
    ```
1. 辞書（ホワイトリスト）に登録する単語を "exclusion.dic" に追加します。

### コード分析規則の設定

C# プロジェクト毎のコード分析規則を EditorConfig ファイルに設定しておきます。
VS2022 だけを使用する場合でも（バージョン管理に追加するため）規則を設定したファイルは作成した方がよいでしょう。

コード分析規則のオプションは以下のサイトを参考に設定します。
VS2022 を使用する場合は PC によってエディタ側の設定が異なる場合があるため、既定値を設定する場合でも全てのオプションを設定しておいた方がいいかもしれません。

https://learn.microsoft.com/ja-jp/dotnet/fundamentals/code-analysis/style-rules/

### 命名規則の設定

コード分析規則の一環として、クラスやメンバの命名規則も EditorConfig ファイルに設定しておきます。
C# の命名規則は以下が参考になります。

https://learn.microsoft.com/ja-jp/dotnet/standard/design-guidelines/naming-guidelines

命名規則の設定はとりあえず以下の様な感じでしょうか。

```config:.editorconfig
## Code style rules - Naming rules
### Symbol group properties
dotnet_naming_symbols.types.applicable_kinds = namespace,class,struct,enum,property,method,field,event,delegate
dotnet_naming_symbols.types.applicable_accessibilities = public,internal,protected,protected_internal,private_protected
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public,internal,protected,protected_internal,private_protected
dotnet_naming_symbols.parameter.applicable_kinds = parameter
dotnet_naming_symbols.parameter.applicable_accessibilities = public,internal,protected,protected_internal,private_protected
dotnet_naming_symbols.type_parameter.applicable_kinds = type_parameter
dotnet_naming_symbols.type_parameter.applicable_accessibilities = public,internal,protected,protected_internal,private_protected
### Naming style properties
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_naming_style.pascal_case_with_i.capitalization = pascal_case
dotnet_naming_style.pascal_case_with_i.required_prefix = I
dotnet_naming_style.pascal_case_with_t.capitalization = pascal_case
dotnet_naming_style.pascal_case_with_t.required_prefix = T
dotnet_naming_style.camel_case.capitalization = camel_case
### Naming rule properties
dotnet_naming_rule.types_pascal_case.symbols = types
dotnet_naming_rule.types_pascal_case.style = pascal_case
dotnet_naming_rule.interface_pascal_case_with_i.symbols = interface
dotnet_naming_rule.interface_pascal_case_with_i.style = pascal_case_with_i
dotnet_naming_rule.parameter_camel_case.symbols = parameter
dotnet_naming_rule.parameter_camel_case.style = camel_case
dotnet_naming_rule.type_parameter_pascal_case_with_t.symbols = type_parameter
dotnet_naming_rule.type_parameter_pascal_case_with_t.style = pascal_case_with_t
```

### VSCode の設定

VSCode 本体に設定しない（バージョン管理に追加して共有する）設定を ".vscode/settings.json" に追加します。
例えば `editor.rulers` や `editor.formatOnSave` 等。

## 新しいプロジェクトを作成した時にやること

1. コード分析の有効化
1. プロジェクト情報の設定
1. PDB ファイルの無効化

### コード分析などの有効化

プロジェクトファイル "*.csproj" に以下の設定を追加してコード分析などを有効にしておきます。
この内 `Nullable` と `ImplicitUsings` は新しいプロジェクトを作成した時に既に設定されています。

```xml:Sandbox.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <!-- NULL 許容参照型に関する警告を有効にします。 -->
    <Nullable>enable</Nullable>
    <!-- 暗黙的な using ディレクティブを有効にします。 -->
    <ImplicitUsings>enable</ImplicitUsings>
    <!-- コード分析の推奨レベルに設定します。 -->
    <AnalysisLevel>latest-recommended</AnalysisLevel>
    <!-- ビルド時のスタイル分析を有効にします。 -->
    <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
  </PropertyGroup>

  <!-- 以下は VS2022 以外でコード分析規則 IDE0130 を使用するために必要になります。 -->
  <ItemGroup>
    <CompilerVisibleProperty Include="RootNamespace" />
    <CompilerVisibleProperty Include="ProjectDir" />
  </ItemGroup>

</Project>
```

### プロジェクト情報の設定

忘れない内に `Version` や `Description` などのアセンブリ属性を "*.csproj" ファイルに追加します。

### PDB ファイルの無効化

リリースビルドの時に "*.pdb" ファイル等の出力を無効にしておきます。
（このファイルを使用したことがない…）

```xml:Sandbox.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup Condition="'$(Configuration)'=='Release'">
    <DebugSymbols>false</DebugSymbols>
    <DebugType>none</DebugType>
  </PropertyGroup>

</Project>
```