1: 命名ガイドライン:
クラス名と変数名は Pascal 命名法 (各単語の最初の文字が大文字) を採用し、関数のパラメータ名は最初の単語の最初の文字が小文字で使用され、残りの単語の最初の文字が大文字で表記されます。
2: タイプ設計ガイドライン
クラスと構造体から選択する
1. まず、クラスは参照型でヒープ上にメモリを割り当て、GC リカバリが必要 構造体は値型で、スタック上にメモリを割り当て、GC を必要としない スコープ終了後、メモリは解放されるしたがって、値型の割り当てと割り当て解除は、一般に参照型の割り当てと割り当て解除よりも安価です。
2. 値が参照型である配列 (ヒープ上の参照型の参照アドレスを格納する) と、値が値型である配列 (スタック上の値型の実際の値を格納する) が含まれています。値型配列の割り当てと解放は、参照型配列の割り当てと解放よりもコストが低くなります。1 と同じです。
3. 値型がインターフェイスを統合する場合 (インターフェイスが参照型である場合)、値型をボックス化して参照型に変換する必要があり、値型に変換し直すときにボックス化が解除されます。ボックスはヒープ上に割り当てられ、ガベージ コレクションされるオブジェクトであるため、過剰なボックス化とボックス化解除は、ヒープ、ガベージ コレクター、そして最終的にはアプリケーションのパフォーマンスに悪影響を与える可能性があります。対照的に、参照型を変換する場合には、そのようなボックス化は発生しません。
4. 繰り返しになりますが、参照型への代入では参照がコピーされ、値型への代入では値全体がコピーされます。したがって、大きな参照型への代入は、大きな値型への代入よりもコストが低くなります。
次の状況では、クラスのインスタンスの代わりに構造体を定義することを検討してください。
- その型のインスタンスが小さく、多くの場合寿命が短い場合、または他のオブジェクトに埋め込まれていることが多い場合。
int
プリミティブ型 ( 、double
など)と同様に、論理的な方法で単一の値を表します。- インスタンスのサイズは 16 バイト未満です。
- それは不変です。
- 頻繁には箱に入れません
- 他のケースはクラスである必要があります
2. 抽象クラスの設計
- 抽象クラスは親クラスとしてのみ使用でき、サブクラスをインスタンス化するメソッドを通じて間接的に親クラスをインスタンス化できます。
- 抽象メソッド (メソッド本体がないため、サブクラスで実装する必要がある)、非抽象メソッド (メソッド本体を持つことができる) が存在する可能性があります。
- コンストラクターは存在できますが、プライベートにすることはできません。プライベートの場合、インスタンスの構築時にサブクラスがアクセスできないためです。
- 抽象メソッドは抽象クラス内でのみ宣言できます
3.インターフェース設計
- 空のインターフェイスを宣言しないでください
- インターフェースは宣言されているため、それを継承するのが最善です
4. 構造設計
構造体の引数なしのコンストラクターを宣言しないでください。この原則に従うと、配列の各項目でコンストラクターを実行せずに構造体の配列を作成できます。これも C# ではサポートされていません。
不変型は値を変更するときにオブジェクトを再作成し、元の値を置き換えるため、可変型のプロパティを宣言しないでください (基本型は不変型、参照型は可変型です)。
不変型: 宣言後は値が変化しないため、スレッド間の競合が発生せず、複数のスレッド間のアクセスに非常に便利です。
不変型として宣言されたメソッドは次のとおりです。
目的は、その値にアクセスできるようにすることですが、変更することはできません。readonly const キーワードを追加するか、get 属性/set 属性のみをプライベートとして設定して、外部からその値を変更できないようにすることができます。
readonly: static と一緒に使用できます。クラス レベル (クラス名で呼び出されます) です。単独で使用する場合はオブジェクト レベル (オブジェクトによって呼び出されます)。最初に割り当てる必要はありません。値の場合、値の不変性を満たすためにコンストラクターで値を割り当てることができます。
const: クラス レベル (クラス名を通じて呼び出される)。値の不変性を満たすために、宣言時に値を割り当てる必要があります。配列、構造体には使用できません。