クラス構造に関する項目の順序に関する公式の C# ガイドラインはありますか?
うまくいきますか:
- パブリック フィールド
- プライベート フィールド
- プロパティ
- コンストラクター
- メソッド
?
アイテムの順序について厳格なルールがあるかどうか気になりますか? 私はどこにでもいるようなものです。どこでもできるように、特定の基準に固執したい.
本当の問題は、私のより複雑なプロパティがメソッドのように見えてしまい、コンストラクターの前の上部で場違いに感じられることです。
ヒント/提案はありますか?
クラス構造に関する項目の順序に関する公式の C# ガイドラインはありますか?
うまくいきますか:
アイテムの順序について厳格なルールがあるかどうか気になりますか? 私はどこにでもいるようなものです。どこでもできるように、特定の基準に固執したい.
本当の問題は、私のより複雑なプロパティがメソッドのように見えてしまい、コンストラクターの前の上部で場違いに感じられることです。
ヒント/提案はありますか?
StyleCop Rules Documentationによると、順序は次のとおりです。
クラス、構造体、またはインターフェイス内: (SA1201 および SA1203)
これらの各グループ内で、アクセス順: (SA1202)
各アクセス グループ内で、静的順、次に非静的順: (SA1204)
各フィールドの静的/非静的グループ内で、読み取り専用、次に非読み取り専用の順に並べます: (SA1214 および SA1215)
展開されたリストは 130 行の長さなので、ここでは展開しません。展開されたメソッド部分は次のとおりです。
ドキュメントには、所定の順序が適切でない場合 (たとえば、複数のインターフェイスが実装されており、インターフェイスのメソッドとプロパティをグループ化する必要がある場合) は、部分クラスを使用して関連するメソッドとプロパティをグループ化することが記載されています。
可視性や項目の種類 (フィールド、プロパティ、メソッドなど) ごとにグループ化するのではなく、機能ごとにグループ化するのはどうですか?
言語や業界標準についてはわかりませんが、各セクションを #region でラップして、次の順序で並べる傾向があります。
ステートメントの使用
名前空間
クラス
プライベートメンバー
パブリック プロパティ
コンストラクター
公開メソッド
プライベート メソッド
IDesignのコーディング標準、またはBrad Abram の Web サイトにリストされているコーディング標準を使用することをお勧めします。それらは私が見つけた最高の2つです。
ブラッドは言うだろう...
クラス メンバーはアルファベット順に並べ、セクション (フィールド、コンストラクター、プロパティ、イベント、メソッド、プライベート インターフェイスの実装、ネストされた型) にグループ化する必要があります。
通常、私は次のパターンに従おうとします。
各パーツ (静的およびインスタンス) は、次のメンバー タイプで構成されます。
次に、メンバーは可視性によって並べ替えられます (可視性の低いものから多いものへ)。
順序は定説ではありません。単純なクラスは読みやすいですが、より複雑なクラスはコンテキスト固有のグループ化が必要です。
私の好みは、種類別に並べてから、次のように可視性を下げることです
public methods
public events
public properties
protected methods
protected events
protected properties
private methods
private events
private properties
private fields
public delegates
public interfaces
public classes
public structs
protected delegates
protected interfaces
protected classes
protected structs
private delegates
private interfaces
private classes
private structs
私はこれが Style Cop に違反していることを知っており、型の実装の詳細をそのインターフェイスの前に配置する必要がある正当な理由を誰かが教えてくれれば、私は喜んで変更します。現時点では、プライベート メンバーを最後に配置することを強く好みます。
注: public または protected フィールドは使用しません。
前述のように、C# 言語にはレイアウトを決定するものは何もありません。私は個人的に領域を使用しており、平均的なクラスに対してこのようなことを行っています。
public class myClass
{
#region Private Members
#endregion
#region Public Properties
#endregion
#region Constructors
#endregion
#region Public Methods
#endregion
}
とにかく理にかなっている
StyleCopから
プライベート フィールド、パブリック フィールド、コンストラクター、プロパティ、パブリック メソッド、プライベート メソッド
StyleCop は MS ビルド プロセスの一部であるため、事実上の標準と見なすことができます。
私は、プライベート フィールドをコンストラクターと一緒に一番上に配置し、その後にパブリック インターフェイス ビットを配置し、次にプライベート インターフェイス ビットを配置することを好みます。
また、クラス定義が長すぎて項目の順序が重要になる場合、それはおそらく、クラスがかさばりすぎて複雑であることを示すコード臭であり、リファクタリングする必要があります。
できるだけシンプルにしています(少なくとも私にとっては)
列挙型
宣言
コンストラクター
オーバーライド
メソッド
プロパティ
イベント ハンドラー
最も近いものは、Brad Abrams による「Design Guidelines, Managed Code and the .NET Framework」( http://blogs.msdn.com/brada/articles/361363.aspx ) です。
多くの標準がここに概説されています。関連するセクションは2.8だと思います。
これが古いことは知っていますが、私の注文は次のとおりです。
public、protected、private、internal、abstract の順に
私はまた、このようなプロパティを書き出すのが好きです (省略形のアプローチではなく)
// Some where in the fields section
private int someVariable;
// I also refrain from
// declaring variables outside of the constructor
// and some where in the properties section I do
public int SomeVariable
{
get { return someVariable; }
set { someVariable = value; }
}
これに関して提案されている唯一のコーディング ガイドラインは、クラス定義の先頭にフィールドを配置することです。
私はコンストラクターを次に置く傾向があります。
私の一般的なコメントは、ファイルごとに1つのクラスに固執する必要があるということです.クラスが十分に大きく、プロパティとメソッドの編成が大きな懸念事項である場合、クラスの大きさはどれくらいですか?とにかくそれをリファクタリングする必要がありますか? それは複数の懸念を表していますか?
何らかの方法でそれを強制する言語には確かに何もありません。私は可視性 (public、protected、private) によって物事をグループ化し、#regions を使用して、プロパティ、メソッドなどに関係なく、関連するものを機能的にグループ化する傾向があります。構築メソッド (実際の ctor であれ静的ファクトリ関数であれ) は、クライアントが最初に知る必要があるものであるため、通常は一番上にあります。