前回はプロパティとかコンストラクタとかどちらを上に書くべきか?といった内容をご説明しました。今回もコード内順序のお話ですが,アクセスレベルを加味したコード内順序のお話になります。アクセスレベルとはpublicなどのアクセス修飾子の事です。
アクセスレベルごとのコード内順序
アクセスレベルごとに,コード内の順序があり,それに違反すると警告が表示されます。基本的には,アクセスレベルの広い順番で書くという事になります。アクセスレベルはpublicが一番広く,privateが一番狭いですから,例えばpublicメソッドよりもprivateメソッドを上に記述すると警告が出ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/// /// 値の取得 /// ///商品ID /// 値 private int GetData2(int productId) { return 0; } /// /// 値の取得 /// ///商品ID /// 値 public int GetData(int productId) { if (productId == 0) { productId = 1; return productId; } ////値を抽出してから返却します for (int i = 0; i < 10; i++) { productId = 0; } return 0; } |
SA1202
アクセスレベルの順序
アクセスレベルの順序は次のように定められています。
- public
- internal
- protected internal
- protected
- private
アクセスレベルは前述のコンストラクタやプロパティの順序内での順序となるので,プロパティはプロパティの中でアクセスレベル順になるようにします。ですのでpublicのプロパティ,internalのプロパティ,publicのメソッドというような順序で書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/// /// 顧客の名前を取得または設定します。 /// public string ProductName { get; set; } /// /// 顧客の名前を取得または設定します。 /// internal string ProductName2 { 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; } |
この例のように,internalでもプロパティであれば,publicのメソッドより上に書く必要があります。それぞれの項目(プロパティなど)ごとに並べて,その中で,アクセスレベルの広い順と覚えてください。
同じアクセスレベルならStaticを上に書く
同じアクセスレベルでもstaticが優先されます。Internalとinternal staticであれば,internal staticを上に書く必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/// /// 値の取得 /// ///商品ID /// 値 public int GetData(int productId) { if (productId == 0) { productId = 1; return productId; } ////値を抽出してから返却します for (int i = 0; i < 10; i++) { productId = 0; } return 0; } /// /// 値の取得 /// ///商品ID /// 値 public static int GetDataStatic(int productId) { return 0; } |
このように同じアクセスレベルでstaticを下に書くと警告が表示されます。
SA1204
同じアクセスレベルではstaticが優先となります。次のように修正することで警告が消えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/// /// 値の取得 /// ///商品ID /// 値 public static int GetDataStatic(int productId) { return 0; } /// /// 値の取得 /// ///商品ID /// 値 public int GetData(int productId) { if (productId == 0) { productId = 1; return productId; } ////値を抽出してから返却します for (int i = 0; i < 10; i++) { productId = 0; } return 0; } |
ProductEntity全体
最後にProductEntity全体のコードをご参考に記載しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
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; } /// /// 顧客の名前を取得または設定します。 /// internal string ProductName2 { get; set; } /// /// 値の取得 /// ///商品ID /// 値 public static int GetDataStatic(int productId) { return 0; } /// /// 値の取得 /// ///商品ID /// 値 public int GetData(int productId) { if (productId == 0) { productId = 1; return productId; } ////値を抽出してから返却します for (int i = 0; i < 10; i++) { productId = 0; } return 0; } /// /// 値の取得 /// ///商品ID /// 値 private int GetData2(int productId) { return 0; } /// /// 設定 /// private void SetValue() { } } } |
C#を正しい3層構造で造れてますか?
#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_最後に