目次
第1章 データ型の扱い
項目1 アクセス可能なデータメンバーの代わりにプロパティを使おう
項目2 可変データには暗黙のプロパティを使おう
項目3 値型は可変より不変が好ましい
項目4 値型と参照型の違いを正しく理解しよう
項目5 値型は0でも有効な状態にしよう
項目6 プロパティはデータらしく実装しよう
項目7 匿名型やタプルは型のスコープを限定するのに使える
項目8 匿名型にローカル関数を定義する
項目9 さまざまな同一性が、どういう関係にあるのかを把握しよう
項目10 GetHashCode()の罠に注意
第2章 API設計
項目11 独自のAPIでは変換演算子を定義しない
項目12 省略可能なパラメータを使ってメソッドの多重定義を減らそう
項目13 独自の型は可視性を制限しよう
項目14 継承するよりインターフェイスを定義して実装しよう
項目15 インターフェイスメソッドと仮想メソッドの違い
項目16 通知のイベントパターンを実装しよう
項目17 内部オブジェクトへの参照を返さないように注意しよう
項目18 イベントハンドラよりオーバーライドが好ましいとき
項目19 基底クラスに定義のあるメソッドを多重定義しない
項目20 オブジェクトの結合はイベントによって実行時に強まる
項目21 イベントをvirtual宣言するのは避けよう
項目22 明瞭で最小で完全なメソッドグループを作ろう
項目23 部分クラスにはコンストラクタ、ミューテータ、イベントハンドラの部分メソッドを入れる
項目24 ICloneableは設計の選択肢を狭めるので避けよう
項目25 配列をパラメータとして使うのはparams配列だけにしよう
項目26 イテレータや非同期メソッドのエラーは、ローカル関数で即座に報告できる
第3章 タスクベースの非同期プログラミング
項目27 非同期処理には非同期メソッドを使おう
項目28 async voidメソッドを書くべからず
項目29 同期メソッドと非同期メソッドの混成を避けよう
項目30 非同期処理に不要なスレッド割り当てを避けよう
項目31 不要なコンテクスト切り替えを避けよう
項目32 複数のTaskオブジェクトで非同期処理を構成する
項目33 タスクのキャンセルや進捗報告を行うプロトコルを実装する
項目34 総称的なValue Task〈T〉型で非同期処理の戻り値をキャッシュする
第4章 並列処理
項目35 PLINQによる並列アルゴリズムの実装を学ぼう
項目36 並列アルゴリズムは例外を考慮して構築しよう
項目37 スレッドを作る代わりにスレッドプールを使おう
項目38 スレッド間通信にはBackgroundWorkerを使おう
項目39 XAML環境でのスレッド間コールを理解しよう
項目40 同期をとるにはlock()を最初の選択肢にしよう
項目41 スコープが最小限のロックハンドルを使おう
項目42 ロックしたセクションで未知のコードを呼び出さない
第5章 動的プログラミング
項目43 動的型付けの長所と短所を理解しよう
項目44 動的型付けで、ジェネリックな型パラメータの実行時の型を活用する
項目45 データ駆動の動的な型は、DynamicObjetかIDynamicMetaObjectProviderで作ろう
項目46 ExpressionAPIの使い方を理解しよう
項目47 パブリックAPIでは、動的オブジェクトを最小限にしよう
第6章 グローバルなC#コミュニティに参加しよう
項目48 人気のある答えではなく、最良の答えを探そう
項目49 言語の仕様と実装に参加しよう
項目50 アナライザによる実践の自動化を考慮しよう