🤩

【C#】初心者におすすめ!コードアナライザーを使おう!【.NET】

2023/12/21に公開

コードアナライザーとは

初心者がやりがちな 「良くないC#の書き方」を教えてくれるツール です!

良くない」とはこういうのです!

  • 遅い
  • バグりやすい
  • 危ない(セキュリティリスク)
  • 書き方がバラバラ

あー、それ!初心者が最初に教えてほしいやつ!

しかも!教えてくれるだけじゃなくて自動で直してくれます…!!(リファクタリング)
(一部だけだけど…)

タダで最初から使える

.NET SDKをインストールすると使えるようになります。
しかも無料!

https://dotnet.microsoft.com/ja-jp/download

無料ってことはつまり…タダ、ってコト!?

VS Codeでも使える

「初心者は本家Visual Studio(特にVS Comunity)を使おう」って言われるのですが、
Visual Studio Code (VS Code) + C# Dev Kit拡張でもコードアナライザーは使えます。

https://code.visualstudio.com/

https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit

本家VSはクソデカでインストールも遅いので、軽めのVS Codeが個人的にはオススメです!

AIが教えてくれないことも教えてくれる!

最近ならAIに教えてもらうことも多いと思いますが…コードアナライザーの方がいいことがあります。

AI(Chat GPTくんとかCopilotくんとか)が教えてくれるのは、次の書き方です。

  • みんなが良く書く書き方
  • 少し前までの書き方

みんなが良く書く書き方…ということは、みんながよくやる間違いをおすすめしてくることもある、ってことです。
ヒエッ。
AIは正しいかを判断してるんじゃなくて、「みんなが使ってるかどうか」で判断してるからね…

また、最新の情報に対応してないので、
たとえば最近出たばっかのC# 12.0の「コレクション式」とかは教えてくれません
(とくにChat GPTくん)。めっちゃ便利なのにね。

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/collection-expressions

これに限らず、AIくんのコード、なんか微妙に古臭いコードになるんですよね…。
流行ってると思ってムリに「なぁぜなぁぜ」を使ってくるオジサンみたいだぁ…。

コードアナライザーだとコレクション式も教えてくれます。

💡アイコンを押すと、直すこともできます。

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

AIくんだけにまかせるんじゃなくて、AIくんにざっくりかかせてコードアナライザーで直す、みたいなのだと速いかも?

設定方法

プロジェクトごと

C#のプロジェクトをつくると「【プロジェクト名】.csproj」っていうファイルができます。

たとえばコンソールアプリ(黒い画面で動かすやつ)をdotnet new consoleで作るとこうなります。

csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

このcsprojをVSCodeで開いて2行追加します!(PropertyGroupの中。)

1行目:コードアナライザーを有効にする

.NET SDKに標準のコードアナライザーを有効にするのはこの1行。

+ <EnableNETAnalyzers>true</EnableNETAnalyzers>

これだけでも使えます!

2行目:うるささを調整する

2行目を追加することでもう少し調整します!

+ <AnalysisLevel>latest-All</AnalysisLevel>

こうすると、嫁に対して指でほこりチェックして
あ~ら、全然掃除できてないじゃないの!一体、どんなしつけを受けてきたのかしらねぇ?
っていう姑ぐらいうるさくなります!!!

あ~ら、全然掃除できてないじゃないの!一体、どんなしつけを受けてきたのかしらねぇ?

ウワー!!!!やめーや!!!!

latest-Recommendedlatest-Minimumくらいがいいかも?

https://learn.microsoft.com/ja-jp/dotnet/core/project-sdk/msbuild-props#analysislevel

AnalysisMode うるささレベル
Minimum ミニマムっていうから少ないのかな?と思いますが、Defaultよりは指摘してくれるらしい…
Recommended これが一応推奨らしい
All "あ~ら、全然掃除できてないじゃないの!一体、どんなしつけを受けてきたのかしらねぇ?"

https://learn.microsoft.com/ja-jp/dotnet/core/project-sdk/msbuild-props#analysismode

latestは最新の.NETバージョンを指します(.NET 8.0で作ってれば 8.0 = C# 12.0)。6.0にすれば.NET 6.0(=C# 10.0)相当の指摘にすることもできます。

設定後

追加したら保存してください。
場合によってはすぐ反映されないかも?
(VSCodeなら「開発者:ウィンドウの再読み込み」コマンドとかで有効になることが多いです)

追加したcsproj
追加したcsproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>

    <EnableNETAnalyzers>true</EnableNETAnalyzers>
    <AnalysisLevel>latest-Minimum</AnalysisLevel>
  </PropertyGroup>

</Project>

ソリューションごと

上の設定はプロジェクトそれぞれのcsprojに追加する必要があります!面倒!

なのでいっぱいプロジェクトがある場合はまとめて設定しましょう。

上の階層にDirectory.Build.propsDirectory.Build.targetsというファイルを作って、
さっきの中身を書いておきます。そうすると下の階層のプロジェクトでは自動でよんでくれるようになります。

.props.csprojより先に読まれるのでコードアナライザーの場合は.propsがいいかも。

Directory.Build.props
<Project>
  <PropertyGroup>
      <EnableNETAnalyzers>true</EnableNETAnalyzers>
      <AnalysisLevel>latest-Minimum</AnalysisLevel>
  </PropertyGroup>
</Project>

https://qiita.com/dsyuuto/items/aca50a3f2ce20ac9fac1

https://learn.microsoft.com/ja-jp/visualstudio/msbuild/customize-by-directory?view=vs-2022

抑える

方法はいくつかあります!

https://tech-lab.sios.jp/archives/34129

素晴らしい記事に解説はまるなげ!
以下補足です!

  • EditorConfigで抑える
  • 属性をつかってクラスやメソッド単位で抑える
  • 指定範囲で抑える

EditorConfigで抑える

プロジェクト全体とかで設定できます。
単に抑えるだけじゃなくてsuggestionとかerrorとかに調整できるのがいいですね!
suggestionにして場合場合で判断するのがいいかも。

# こっちは完全に抑える
dotnet_diagnostic.CA1707.severity = none
# これ直さなくていい?って聞いてもらえる
dotnet_diagnostic.CA1707.severity = suggestion
# エラーにする
dotnet_diagnostic.CA1707.severity = error

属性をつかってクラスやメソッド単位で抑える

次に良く使うのがこれ。
SuppressMessageAttributeでクラスとかメソッド単位で指定して抑えることができます。
引数とか戻り値とかもできるはず。

using System.Diagnostics.CodeAnalysis;

[SuppressMessage("カテゴリ", "ID")]
void MyFunction(int arg1, string arg2)
{
	//...
}
  • カテゴリはコードアナライザーの名前とか
    • カテゴリは指定しなくても効くようです
  • IDは短いの(CAXXXXとか)でOK
    • IDが合えば抑えられます

https://learn.microsoft.com/ja-jp/visualstudio/code-quality/in-source-suppression-overview?view=vs-2022&tabs=csharp#in-source-suppression-and-the-suppressmessage-attribute

指定範囲で抑える

VSCodeでは💡アイコンから使えますが、意外と使いにくいです。

#pragma warning disable CA1303 // ローカライズされるパラメーターとしてリテラルを渡さない
Console.WriteLine("Hello, World!");
#pragma warning restore CA1303 // ローカライズされるパラメーターとしてリテラルを渡さない

もっと教えてほしい…

標準のコードアナライザー(.NET Analyzer)以外にも追加で教えてくれるようにできます!

標準以外のアナライザーはnuget経由でライブラリみたいに追加します。

https://www.nuget.org/

Directory.Build.propsに書いておけば子階層全部で有効にできます。

Directory.Build.propsに書く例
<ItemGroup>
		<PackageReference Include="Roslynator.Analyzers" Version="4.7.0">
			<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
			<PrivateAssets>all</PrivateAssets>
		</PackageReference>
</ItemGroup>

Roslynator

https://github.com/dotnet/roslynator

これだけあれば いいかんじ になるすごいやつ!
公式+これだけでもじゅうぶんかも…

アナライザーは以下の3つに分かれてますので3つインストールしてみてください。

Roslynator.Analyzers
Roslynator.CodeAnalysis.Analyzers
Roslynator.Formatting.Analyzers

NetFabric.Hyperlinq.Analyzer

https://github.com/NetFabric/NetFabric.Hyperlinq.Analyzer

LINQ関係の事を色々おしえてくれます!

Meziantou.Analyzer

https://github.com/meziantou/Meziantou.Analyzer

ちょっとうるさいけど色々指摘してくれるAnalyzerです!
部分的に有効にするのがオススメ!

Microsoft.Unity.Analyzer

https://github.com/microsoft/microsoft.unity.analyzers

Unity向けです!

xUnit / NUnit

テストライブラリ用のコードアナライザーもあります!ライブラリ公式のと、Microsoftが出してる2種類があります。
Roslynatorが出してる版もあります。

xUnit

https://www.nuget.org/packages/xunit.analyzers

https://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp.Analyzer.Testing.XUnit

https://www.nuget.org/packages/Roslynator.Testing.CSharp.Xunit

NUnit

https://www.nuget.org/packages/NUnit.Analyzers

https://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp.Analyzer.Testing.NUnit

MSTest

https://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp.Analyzer.Testing.MSTest

https://www.nuget.org/packages/Roslynator.Testing.CSharp.MSTest

まとめ!

  • 初心者はコードアナライザーに色々教えてもらおう!
  • ChatGPTやCoPilotはちょい古おじさん。組み合わせて使おう。
  • うるささは調整しよう!
  • 公式以外にも色々アナライザーがあるぞ!

Discussion