今回は,クラス内に書く,コンストラクタやプロパティなどの,書く順番に関するルールを解説していきます。この警告のおかげで,決められた順序で書かないと警告になるので,チーム全体が同じ順番で記述することができます。
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#でコーディングしている以上,永遠に付きまとうので,順序違いをみたら,気持ちが悪くなるくらい,体にしみこませてください。
#01_はじめに
#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_最後に
