C#コーディングルール_#28_コンストラクタやプロパティの書く順番

当サイトではアフィリエイト広告を利用しています。

C#コーディングルール

今回は,クラス内に書く,コンストラクタやプロパティなどの,書く順番に関するルールを解説していきます。この警告のおかげで,決められた順序で書かないと警告になるので,チーム全体が同じ順番で記述することができます。

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#でコーディングしている以上,永遠に付きまとうので,順序違いをみたら,気持ちが悪くなるくらい,体にしみこませてください。