今回は,クラス内に書く,コンストラクタやプロパティなどの,書く順番に関するルールを解説していきます。この警告のおかげで,決められた順序で書かないと警告になるので,チーム全体が同じ順番で記述することができます。
SA1201
例えば次のように,メソッドより後に,プロパティを記述してみてください。
/// /// 値の取得 /// ///商品ID /// 値 public int GetData(int productId) { if (productId == 0) return 0; if (productId == 0) { productId = 1; return productId; } ////値を抽出してから返却します for (int i = 0; i < 10; i++) { productId = 0; } return 0; } /// /// 顧客の名前を取得または設定します。 /// public string ProductName { get; set; }
すると,SA1201という警告が表示されます。
WEBサイトで警告内容を確認すると次のような内容になっています。
コード内の順序が間違っていることを警告されています。
コード内の順序1
SA1201の警告内容の中に,コード内の順序が解説されています。
まず初めに,次のような順序が記されています。
しかし,この順序は1ファイルに1クラスで記述するということにしておけば,関係ないので,あまり気にする必要がありません。要するにアプリケーション全体で使用するクラスや列挙体,構造体などは,1つにつき1ファイルにしておけば,順序などは最初から必要ありません。クラスの中だけで使用する列挙体などは,この限りではないので,次に解説する順序を確認にしてください。
コード内の順序2
これが,クラスの中に記述する順序です。色々ありますが,代表的なもので言うと次のあたりになると思います。
- フィールド
- コンストラクタ
- デストラクタ
- デリゲート
- イベント
- 列挙体
- プロパティ
- メソッド
まずクラスを書いたら,そのクラスで保持するメモリ空間として,フィールドを宣言します。その後にコンストラクタとデストラクタを書きます。その後にイベント関係であるデリゲート,イベントを書きます。そして列挙体。この辺りまでで,このクラスがどのような値を保持して,どのようなイベントを通知するのかが理解できます。そしてプロパティをみれば,どのような値が公開されているのか,外部から設定できるのかが把握できます。最後にメソッドです。この順序に違反すると今回の警告が表示されます。この警告は大事なので,必ず対応しましょう。
コード内順序の例
コード内順序に従うと,次のような感じになります。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Anderson.MX99.WinForm.Objects { /// /// 商品エンティティ /// internal sealed class ProductEntity { ////フィールド ////コンストラクタ ////デリゲート ////イベント ////列挙体 ////プロパティ ////メソッド /// /// 値 /// private int _productId = 0; /// /// コンストラクタ /// public ProductEntity() { } /// /// デストラクタ /// ~ProductEntity() { } /// /// 商品が変更されたときに通知されます /// public event Action ProductChanged; /// /// 顧客の名前を取得または設定します。 /// public string ProductName { get; set; } /// /// 値の取得 /// ///商品ID /// 値 public int GetData(int productId) { if (productId == 0) { productId = 1; return productId; } ////値を抽出してから返却します for (int i = 0; i < 10; i++) { productId = 0; } return 0; } } }
順序をわざと入れ替えると,警告がでるので,色々試してみてください。この順序はC#でコーディングしている以上,永遠に付きまとうので,順序違いをみたら,気持ちが悪くなるくらい,体にしみこませてください。
#02_名前の付け方
#03_名前付けのガイドライン
#04_パスカルケースとキャメルケース
#05_パスカルとキャメルの内訳
#06_パスカルとキャメルの実演
#07_2文字の略語は大文字にする
#08_名前空間のガイドライン
#09_ローカルルールについて
#10_private変数にアンダーバーを付ける
#11_コントロールの名付け
#12_クラス名とファイル名の名づけ
#13_StyleCopAnalyzersについて
#14_StyleCopAnalyzersのインストール
#15_ネームスペースの調整
#16_SA0001_プロパティのビルドのXMLでファイルを指定しておくと消える
#17_CS1591_XMLコメントなし
#18_SA1101_thisが付いていない
#19_不要なルールを非表示にする方法
#20_SA1200_usingの場所
#21_SA1400_アクセス修飾子が明示的に定義されていない
#22_その他不要なルールを非表示
#23_コンストラクタとデストラクタを作成
#24_Private変数とパラメータ変数の命名
#25_中括弧の省略禁止と改行
#26_コメントはスラッシュ4つ
#27_プロパティのXMLコメント
#28_コンストラクタやプロパティの書く順番
#29_アクセスレベルを加味した書く順番
#30_インタフェースのIとファイル名の不一致
#31_最後に