狐好きぷろぐらまー

狐好きプログラマーのブログです。

【C#】クラス内の項目の書いていく順番を調べてみた

こんにちは。 pregum_foxです。

結論はこちらです

C#で開発されている方以外でも関係ある事だと思いますが、

皆さんはクラス内のフィールドやプロパティ、コンストラクタなどの項目をどの順番で書いていますか?

私自身、フィールドとそれを使用しているプロパティ、コンストラクタその後はメソッドを順番に書いていています。

しかしイベントや非同期処理が入ってくると、どの順番で使用する少し考えこんでしまうことがあります。

このような感じで考えてしまうことがあるので、最初に順番が決まって入れば、時間が短縮できそうだなと思い、この記事を書いた次第です。

まずはmsdnに項目の順番についての規約があるか探してみました。

調べたものは以下の通りです。

  • StyleCop1 の項目の順番のルール

  • StyleCopAnalyzer2 の項目の順番のルール

それでは調査結果を以下に記載します。

調査結果

残念ながら公式のmsdnにはコーディング規約はありましたが私が調べた限りでは、項目の順番に関する文書はありませんでした。

しかし、こちらのstackoverflowにそれらしき質問がありました。

リンク先の一番上の回答に記載されていた内容では、

以下のような順番になってました。

  1. 定数フィールド
  2. フィールド
  3. コンストラク
  4. ファイナライザ(デストラクタ)
  5. デリゲート
  6. イベント
  7. 列挙型
  8. インタフェース(インタフェース実装)
  9. プロパティ
  10. インデクサー
  11. メソッド
  12. 構造体
  13. クラス

その各項目でアクセス順に並べます

  1. public
  2. internal
  3. protected internal
  4. protected
  5. private

そのアクセスグループ内でstatic、非staticの順に並べます。

  1. static
  2. 非static

これだけです。

virtualについては特に気にしないみたいですね。

また上記のサイトには記述がありませんでしたが、クラス外についての順番についてはStyleCopのルールに記載されていました。

SA1201:ElementsMustAppearInTheCorrectOrder

上記のサイトによるとファイル内の順番は以下の通りです。

  1. 外部エイリアス
  2. usingディレクティブ
  3. 名前空間
  4. デリゲート
  5. 列挙型
  6. インターフェース
  7. 構造体
  8. クラス

これだけでも概ね項目の順番を決めることができそうですが、StyleCopの後継であるStyleCopAnalyzerでのルールではどうなっているか気になったのでそちらも調べてみました。


項目の順番のルールについては、StyleCopのものとほとんど同じようですがいくつか増えていました。

SA1216:Using static directives should be placed at the correct location.

上記のルールはC#6.0の機能の1つのusing staticとC#7.0の機能の1つのusing aliasディレクティブについてのルールですね。

何とか自分なりに解読した所、using ディレクティブ, using static ディレクティブ, using aliasディレクティブの順番で記載してねだということだそうです。

using System;                    // usingディレクティブ
using static System.Console;     // using staticディレクティブ
using Except = System.Exception; // using aliasディレクティブ

SA1217:Using static directives should be ordered alphabetically

これについては、SA1216の各using ディレクティブの中でもアルファベット順に書いてねということみたいですね。

結果

ファイル内の順番

  1. 外部エイリアス
  2. usingディレクティブ
  3. 名前空間
  4. デリゲート
  5. 列挙型
  6. インターフェース
  7. 構造体
  8. クラス

クラス、構造体、インターフェース内の順番

  1. 定数フィールド
  2. フィールド
  3. コンストラク
  4. ファイナライザ (デストラクタ)
  5. デリゲート
  6. イベント
  7. 列挙型
  8. インターフェース (インターフェースの実装)
  9. プロパティ
  10. インデクサー
  11. メソッド
  12. 構造体
  13. クラス

アクセス修飾子の順番

  1. public
  2. internal
  3. protected internal
  4. protected
  5. private

各アクセスの項目内のstatic, 非staticで分ける

  1. static
  2. 非static

ということになりました。

誰かの参考になれば幸いです。

雑感

Roslynを使えばコマンド一つで並べ替えられるものが作れるのかな?

ちなみにmsdnのコーディング規約はこちらです。

参考サイト

StyleCopのルール内容

StyleCopAnalyzerの使い方

StyleCopAnalyzerのルール内容


  1. c#のコーディング内容をチェックするツール

  2. https://github.com/DotNetAnalyzers/StyleCopAnalyzers