More Effective C#のもくじ

Chapter 1 ジェネリック

  • 1.xフレームワークAPIのクラスではなく、ジェネリッククラスを使え
  • 制約は必要最小限にして十分なものを定義せよ
  • 実行型チェックを使ってジェネリックアルゴリズムを特化せよ
  • ジェネリックを使ってコンパイル時型インターフェイスを強制せよ
  • ジェネリッククラスは、IDisposableを実装する型パラメータのサポートを忘れるな
  • 型パラメータのメソッド制約の定義にはデリゲートを使え
  • 規定クラスやインターフェイスのためにジェネリックな特別バージョンを書くな
  • 型パラメータがインスタンスフィールドでない限り、ジェネリックメソッドを選べ
  • out、ref引数よりもジェネリックタプルを使え
  • ジェネリックなインターフェイスとともに古いインターフェイスも実装せよ

Chapter 2 C#におけるマルチスレッド

  • スレッドを作らずにスレッドプールを使え
  • スレッド間通信のためにBackgroundWorkerを利用せよ
  • 同期のためにはまずlock()を使え
  • ロックハンドルのためにはできる限り小さなスコープを使え
  • ロックされたセクションからは未知のコードを呼び出すな
  • WindowsフォームとWPFのスレッド間呼び出しを理解せよ

Chapter 3 C#の設計実践

  • シーケンスのためには合成できるAPIを作れ
  • アクション、述語、関数から反復処理を切り離せ
  • シーケンスの要素は要求されたときに生成せよ
  • 関数引数を使って結合を緩めよ
  • メソッドグループは明快で完全なものを最小限の規模で作れ
  • 演算子の多重定義よりもメソッドの定義を優先せよ
  • イベントはオブジェクトを実行時に密結合することを理解せよ
  • イベントはvirtual宣言するな
  • 例外はメソッドの約束ごとが守れなかったときに使え
  • プロパティはデータふらしくふるまうように作れ
  • 継承と合成を区別せよ

Chapter 4 C# 3.0の新機能

  • 拡張メソッドでインターフェイスの最小限の約束を補え
  • 拡張メソッドでクローズジェネリック型を拡張せよ
  • ローカル変数はできる限り暗黙の型付けに委ねよ
  • 無名型を使って型のスコープを制限せよ
  • 外部コンポーネントに対する合成可能APIを作れ
  • 束縛変数の変更を避けよ
  • 無名型を使ってローカル関数を定義せよ
  • 拡張メソッドを多重定義してはならない

Chapter 5 LINQの操作

  • クエリ式からメソッド呼び出しの変換がどのように行われるかを理解せよ
  • 遅延評価クエリーを使うようにせよ
  • メソッドよりもラムダ式を使うようにせよ
  • 関数やアクションで例外を投げるな
  • 遅延実行と先行実行を区別せよ
  • 高価なリソースを抱え込まないようにせよ
  • IEnumerableデータソースとIQueryableデータソースを区別せよ
  • Single()とFirst()を使ってクエリのセマンティクスを指定せよ
  • Func<>ではなくExpression<>を格納するようにせよ

Chapter 6 その他

  • null許容値のスコープはできるだけ狭くせよ
  • コンストラクタ、ミューテータ、イベントハンドラのために部分クラス、部分メソッドを使え
  • 配列引数を使わず、Params配列を使え
  • コンストラクタで仮想関数を呼び出すのを避けよ
  • 大規模なオブジェクトでは弱参照を検討せよ
  • ミュータブルでシリアライズできないデータは自動実装プロパティにせよ