Effective C# 6.0/7.0
- 作者:BillWagner
- 発売日: 2018/09/05
- メディア: Kindle版
第1章 C#言語イディオム
- 項目 1 ローカル変数の型をなるべく暗黙的に指定すること
- 項目 2 constよりもreadonlyを使用すること
- 項目 3 キャストにはisまたはasを使用すること
- 項目 4 string.Format() を補間文字列に置き換える
- 項目 5 カルチャー固有の文字列よりもFormattableStringを使用すること
- 項目 6 文字列指定のAPIを使用しないこと
- 項目 7 デリゲートを使用してコールバックを表現する
- 項目 8 イベントの呼び出し時にnull条件演算子を使用すること
- 項目 9 ボックス化およびボックス化解除を最小限に抑える
- 項目10 親クラスの変更に応じる場合のみnew修飾子を使用すること
第2章 リソース管理
- 項目11 .NETのリソース管理を理解する
- 項目12 メンバには割り当て演算子よりもオブジェクト初期化子を使用すること
- 項目13 staticメンバを適切に初期化すること
- 項目14 初期化ロジックの重複を最小化する
- 項目15 不必要なオブジェクトの生成を避けること
- 項目16 コンストラクタ内では仮想メソッドを呼ばないこと
- 項目17 標準的なDisposeパターンを実装する
第3章 ジェネリックによる処理
- 項目18 最低限必須となる制約を常に定義すること
- 項目19 実行時の型チェックを使用してジェネリックアルゴリズムを特化する
- 項目20 IComparableとIComparerにより順序関係を実装する
- 項目21 破棄可能な型引数をサポートするようにジェネリック型を作成すること
- 項目22 ジェネリックの共変性と反変性をサポートする
- 項目23 型パラメータにおけるメソッドの制約をデリゲートとして定義する
- 項目24 親クラスやインターフェイス用に特化したジェネリックメソッドを作成しないこと
- 項目25 型引数がインスタンスのフィールドではない場合にはジェネリックメソッドとして定義すること
- 項目26 ジェネリックインターフェイスとともに古いインターフェイスを実装すること
- 項目27 最小限に制限されたインターフェイスを拡張メソッドにより機能拡張する
- 項目28 構築された型に対する拡張メソッドを検討すること
第4章 LINQを扱う処理
- 項目29 コレクションを返すメソッドではなくイテレータを返すメソッドとすること
- 項目30 ループよりもクエリ構文を使用すること
- 項目31 シーケンス用の組み合わせ可能なAPIを作成する
- 項目32 反復処理をAction, Predicate, Funcと分離する
- 項目33 要求に応じてシーケンスの要素を生成する
- 項目34 関数引数を使用して役割を分離する
- 項目35 拡張メソッドをオーバーロードしないこと
- 項目36 クエリ式とメソッド呼び出しの対応を把握する
- 項目37 クエリを即時評価ではなく遅延評価すること
- 項目38 メソッドよりもラムダ式を使用すること
- 項目39 FuncやAction内では例外をスローしないこと
- 項目40 即時実行と遅延実行を区別すること
- 項目41 コストのかかるリソースを維持しつづけないこと
- 項目42 IEnumerableとIQueryableを区別すること
- 項目43 クエリに期待する意味をSingle()やFirst()を使用して表現すること
- 項目44 束縛した変数を変更しないこと
第5章 例外処理
- 項目45 契約違反を例外として報告すること
- 項目46 usingおよびtry...finallyを使用してリソースの後処理を行う
- 項目47 アプリケーション固有の例外クラスを作成する
- 項目48 例外を強く保証すること
- 項目49 catchからの再スローよりも例外フィルタを使用すること
- 項目50 例外フィルタの副作用を活用する