こんにちは。 pregum_foxです。
結論はこちらです
C#で開発されている方以外でも関係ある事だと思いますが、
皆さんはクラス内のフィールドやプロパティ、コンストラクタなどの項目をどの順番で書いていますか?
私自身、フィールドとそれを使用しているプロパティ、コンストラクタその後はメソッドを順番に書いていています。
しかしイベントや非同期処理が入ってくると、どの順番で使用する少し考えこんでしまうことがあります。
このような感じで考えてしまうことがあるので、最初に順番が決まって入れば、時間が短縮できそうだなと思い、この記事を書いた次第です。
まずはmsdnに項目の順番についての規約があるか探してみました。
調べたものは以下の通りです。
それでは調査結果を以下に記載します。
調査結果
残念ながら公式のmsdnにはコーディング規約はありましたが私が調べた限りでは、項目の順番に関する文書はありませんでした。
しかし、こちらのstackoverflowにそれらしき質問がありました。
リンク先の一番上の回答に記載されていた内容では、
以下のような順番になってました。
その各項目でアクセス順に並べます
- public
- internal
- protected internal
- protected
- private
そのアクセスグループ内でstatic、非staticの順に並べます。
- static
- 非static
これだけです。
virtualについては特に気にしないみたいですね。
また上記のサイトには記述がありませんでしたが、クラス外についての順番についてはStyleCopのルールに記載されていました。
SA1201:ElementsMustAppearInTheCorrectOrder
上記のサイトによるとファイル内の順番は以下の通りです。
これだけでも概ね項目の順番を決めることができそうですが、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 ディレクティブの中でもアルファベット順に書いてねということみたいですね。
結果
ファイル内の順番
クラス、構造体、インターフェース内の順番
- 定数フィールド
- フィールド
- コンストラクタ
- ファイナライザ (デストラクタ)
- デリゲート
- イベント
- 列挙型
- インターフェース (インターフェースの実装)
- プロパティ
- インデクサー
- メソッド
- 構造体
- クラス
アクセス修飾子の順番
- public
- internal
- protected internal
- protected
- private
各アクセスの項目内のstatic, 非staticで分ける
- static
- 非static
ということになりました。
誰かの参考になれば幸いです。
雑感
Roslynを使えばコマンド一つで並べ替えられるものが作れるのかな?