書籍概要

実戦で役立つ C#プログラミングのイディオム/定石&パターン

著者
発売日
更新日

概要

C#のプログラムを作成するには,解こうとする問題の手順と利用するデータ構造を考え,それをC#のコードとして記述するスキルが必要になってきますが,そういったスキルは,現場で利用されているイディオムや定石といったパターンを学習することで得られます。「パターン」を自分の中に叩き込むことが上達の早道なのです。また,さらには,実際に自分でプログラムを書いてみることも必要。本書には章ごとに練習問題も用意されていますので,実地に自分で書くことにより,確固としたプログラミングの力を身につけてください。

こんな方におすすめ

  • 入門書をひととおり理解したレベルのプログラマー
  • 実践的な知識を学びたいプログラミング初心者

目次

  • はじめに

Part 1 C#プログラミングのイディオム/定石&パターン[準備編]
  • Chapter 1 オブジェクト指向プログラミングの基礎
    • 1.1 クラス
      • 1.1.1 クラスを定義する
      • 1.1.2 クラスのインスタンスを生成する
      • 1.1.3 オブジェクトを利用する
      • 1.1.4 インスタンスは複数作れる
    • 1.2 構造体
    • 1.3 値型と参照型
      • 1.3.1 値型の動き
      • 1.3.2 参照型の動き
      • 1.3.3 なぜ値型と参照型が必要なのか?
    • 1.4 静的メンバーと静的クラス
      • 1.4.1 静的プロパティと静的メソッド
      • 1.4.2 静的クラス
    • 1.5 名前空間
    • 1.6 継承
      • 1.6.1 継承とは?
      • 1.6.2 is a 関係
    • 第1章の演習問題

    Chapter 2 C#でプログラムを書いてみよう

    • 2.1 距離換算プログラム
      • 2.1.1 最初のバージョン
      • 2.1.2 計算ロジックをメソッドとして独立させる
      • 2.1.3 プログラムに機能を追加する
      • 2.1.4 メソッドを単機能にする
      • 2.1.5 クラスとして分離する
      • 2.1.6 クラスを利用する
      • 2.1.7 静的メソッドに変更する
      • 2.1.8 静的クラスにする
      • 2.1.9 定数を定義する
      • 2.1.10 完成したソースコード
    • 2.2 売り上げ集計プログラム
      • 2.2.1 Saleクラスを定義する
      • 2.2.2 CSVファイルを読み込む
      • 2.2.3 店舗別売り上げを求める
      • 2.2.4 集計結果を出力する
      • 2.2.5 初版の完成
      • 2.2.6 メソッドの移動
      • 2.2.7 新たなコンストラクタの追加
      • 2.2.8 クラスをインターフェイスに置き換える
      • 2.2.9 varによる暗黙の型指定を使う
      • 2.2.10 完成したソースコード
    • 第2章の演習問題

    Chapter 3 ラムダ式とLINQの基礎

    • 3.1 ラムダ式以前
      • 3.1.1 メソッドを引数に渡したい
      • 3.1.2 デリゲートによる実現
      • 3.1.3 匿名メソッドの利用
    • 3.2 ラムダ式
      • 3.2.1 ラムダ式とは?
      • 3.2.2 ラムダ式を使った例
    • 3.3 Listクラスとラムダ式の組み合わせ
      • 3.3.1 Existsメソッド
      • 3.3.2 Findメソッド
      • 3.3.3 FindIndexメソッド
      • 3.3.4 FindAllメソッド
      • 3.3.5 RemoveAllメソッド
      • 3.3.6 ForEachメソッド
      • 3.3.7 ConvertAllメソッド
    • 3.4 LINQ to Objectsの基礎
      • 3.4.1 LINQ to Objectsの簡単な例
      • 3.4.2 クエリ演算子
      • 3.4.3 シーケンス
      • 3.4.4 遅延実行
    • 第3章の演習問題

    Part 2 C#プログラミングのイディオム/定石&パターン[基礎編]
  • Chapter 4 基本イディオム
    • 4.1 初期化に関するイディオム
      • 4.1.1 変数の初期化
      • 4.1.2 配列とリストの初期化
      • 4.1.3 Dictionaryの初期化
      • 4.1.4 オブジェクトの初期化
    • 4.2 判定と分岐に関するイディオム
      • 4.2.1 単純な比較
      • 4.2.2 数値がある範囲内にあるか調べる
      • 4.2.3 else-ifによる多分岐処理
      • 4.2.4 ふるいにかけて残ったものだけ処理をする
      • 4.2.5 bool値の値が真かどうかを判断する
      • 4.2.6 bool値を返す
    • 4.3 繰り返しのイディオム
      • 4.3.1 指定した回数だけ繰り返す
      • 4.3.2 コレクションの要素をすべて取り出す
      • 4.3.3 Listのすべての要素に対して処理をする
      • 4.3.4 最低1回は繰り返す
      • 4.3.5 ループの途中で処理をやめたい
    • 4.4 条件演算子,null合体演算子によるイディオム
      • 4.4.1 条件により代入する値を変更する
      • 4.4.2 null合体演算子
      • 4.4.3 null条件演算子
    • 4.5 プロパティに関するイディオム
      • 4.5.1 プロパティの初期化
      • 4.5.2 読み取り専用プロパティ
      • 4.5.3 参照型の読み取り専用プロパティ
    • 4.6 メソッドに関するイディオム
      • 4.6.1 可変長引数
      • 4.6.2 オーバーロードよりオプション引数を使う
    • 4.7 その他のイディオム
      • 4.7.1 1を加える場合はインクリメント演算子++を使う
      • 4.7.2 ファイルパスには逐語的リテラル文字列を使う
      • 4.7.3 2つの要素を入れ替える
      • 4.7.4 文字列を数値に変換する
      • 4.7.5 参照型のキャスト
      • 4.7.6 例外を再スローする
      • 4.7.7 usingを使ったリソースの破棄
      • 4.7.8 複数のコンストラクタを定義する
    • 第4章の演習問題

    Chapter 5 文字列の操作

    • 5.1 文字列の比較
      • 5.1.1 文字列どうしを比較する
      • 5.1.2 大文字/小文字の区別なく比較する
      • 5.1.3 ひらがな/カタカナの区別なく比較する
      • 5.1.4 全角/半角の区別なく比較する
    • 5.2 文字列の判定
      • 5.2.1 nullあるいは空文字列かを調べる
      • 5.2.2 指定した部分文字列で始まっているか調べる
      • 5.2.3 指定した部分文字列が含まれているか調べる
      • 5.2.4 指定した文字が含まれているか調べる
      • 5.2.5 条件を満たしている文字が含まれているか調べる
      • 5.2.6 すべての文字がある条件を満たしているか調べる
    • 5.3 文字列の検索と抽出
      • 5.3.1 部分文字列を検索し,その位置を求める
      • 5.3.2 文字列の一部を取り出す
    • 5.4 文字列の変換
      • 5.4.1 文字列の前後の空白を取り除く
      • 5.4.2 指定した位置から任意の数の文字を削除する
      • 5.4.3 文字列に別の文字列を挿入する
      • 5.4.4 文字列の一部を別の文字列で置き換える
      • 5.4.5 小文字を大文字に変換する/大文字を小文字に変換する
    • 5.5 文字列の連結と分割
      • 5.5.1 2つの文字列を連結する
      • 5.5.2 文字列を末尾に追加する
      • 5.5.3 指定した区切り文字で文字列配列を連結する
      • 5.5.4 文字列を指定した文字で分割する
      • 5.5.5 StringBuilderを使った文字列の連結
    • 5.6 その他の文字列操作
      • 5.6.1 文字列から文字を1つずつ取り出す
      • 5.6.2 文字配列から文字列を生成する
      • 5.6.3 数値を文字列に変換する
      • 5.6.4 指定した書式で文字列を整形する
    • 第5章の演習問題

    Chapter 6 配列とListの操作

    • 6.1 本章で共通に使用するコード
    • 6.2 要素の設定
      • 6.2.1 配列あるいはListを同じ値で埋める
      • 6.2.2 配列あるいはListに連続した値を設定する
    • 6.3 コレクションの集計
      • 6.3.1 平均値を求める
      • 6.3.2 最小値,最大値を得る
      • 6.3.3 条件に一致する要素をカウントする
    • 6.4 コレクションの判定
      • 6.4.1 条件に一致する要素があるか調べる
      • 6.4.2 すべての要素が条件を満たしているか調べる
      • 6.4.3 2つのコレクションが等しいか調べる
    • 6.5 単一の要素の取得
      • 6.5.1 条件に一致する最初/最後の要素を取得する
      • 6.5.2 条件に一致する最初/最後のインデックスを求める
    • 6.6 複数の要素の取得
      • 6.6.1 条件を満たす要素をn個取り出す
      • 6.6.2 条件を満たしている間だけ要素を取り出す
      • 6.6.3 条件を満たしている間は要素を読み飛ばす
    • 6.7 その他の処理(変換,ソート,連結など)
      • 6.7.1 コレクションから別のコレクションを生成する
      • 6.7.2 重複を排除する
      • 6.7.3 コレクションを並べ替える
      • 6.7.4 2つのコレクションを連結する
    • 第6章の演習問題

    Chapter 7 ディクショナリの操作

    • 7.1 Dictionaryの基本操作
      • 7.1.1 ディクショナリの初期化
      • 7.1.2 ユーザー定義型のオブジェクトを値に格納する
      • 7.1.3 ディクショナリに要素を追加する
      • 7.1.4 ディクショナリから要素を取り出す
      • 7.1.5 ディクショナリから要素を削除する
      • 7.1.6 ディクショナリからすべての要素を取り出す
      • 7.1.7 ディクショナリからすべてのキーを取り出す
    • 7.2 ディクショナリの応用
      • 7.2.1 ディクショナリに変換する
      • 7.2.2 ディクショナリから別のディクショナリを作成する
      • 7.2.3 カスタムクラスをキーにする
      • 7.2.4 キーのみを格納する
      • 7.2.5 キーの重複を許す
    • 7.3 ディクショナリを使ったサンプルプログラム
      • 7.3.1 Abbreviationsクラス
      • 7.3.2 Abbreviationsを利用する
    • 第7章の演習問題

    Chapter 8 日付,時刻の操作

    • 8.1 DateTime構造体
      • 8.1.1 DateTimeオブジェクトの生成
      • 8.1.2 DateTimeのプロパティ
      • 8.1.3 指定した日付の曜日を求める
      • 8.1.4 閏年か判定する
      • 8.1.5 日付形式の文字列をDateTimeオブジェクトに変換する
    • 8.2 日時のフォーマット
      • 8.2.1 日時を文字列に変換する
      • 8.2.2 日付を和暦で表示する
      • 8.2.3 指定した日付の元号を得る
      • 8.2.4 指定した日付の曜日の文字列を得る
    • 8.3 DateTimeの比較
      • 8.3.1 日時を比較する
      • 8.3.2 日付のみを比較する
    • 8.4 日時の計算(基礎)
      • 8.4.1 指定した時分秒後を求める
      • 8.4.2 n日後,n日前の日付を求める
      • 8.4.3 n年後,nカ月後を求める
      • 8.4.4 2つの日時の差を求める
      • 8.4.5 2つの日付の日数差を求める
      • 8.4.6 月末日を求める
      • 8.4.7 1月1日からの通算日を求める
    • 8.5 日時の計算(応用)
      • 8.5.1 次の指定曜日を求める
      • 8.5.2 年齢を求める
      • 8.5.3 指定した日が第何週か求める
      • 8.5.4 指定した月の第n回目のX曜日の日付を求める
    • 第8章の演習問題

    Part 3 C#プログラミングのイディオム/定石&パターン[実践編]
  • Chapter 9 ファイルの操作
    • 9.1 テキストファイルの入力
      • 9.1.1 テキストファイルを1行ずつ読み込む
      • 9.1.2 テキストファイルを一気に読み込む
      • 9.1.3 テキストファイルをIEnumerableとして扱う
    • 9.2 テキストファイルへの出力
      • 9.2.1 テキストファイルに1行ずつ文字列を出力する
      • 9.2.2 既存テキストファイルの末尾に行を追加する
      • 9.2.3 文字列の配列を一気にファイルに出力する
      • 9.2.4 既存テキストファイルの先頭に行を挿入する
    • 9.3 ファイルの操作
      • 9.3.1 ファイルの有無を調べる
      • 9.3.2 ファイルを削除する
      • 9.3.3 ファイルをコピーする
      • 9.3.4 ファイルを移動する
      • 9.3.5 ファイル名を変更する
      • 9.3.6 ファイルの最終更新日時/作成日時の取得/設定
      • 9.3.7 ファイルのサイズを得る
      • 9.3.8 FileとFileInfo,どちらを使うべきか?
    • 9.4 ディレクトリの操作
      • 9.4.1 ディレクトリの有無を調べる
      • 9.4.2 ディレクトリを作成する
      • 9.4.3 ディレクトリを削除する
      • 9.4.4 ディレクトリを移動する
      • 9.4.5 ディレクトリ名を変更する
      • 9.4.6 指定フォルダにあるディレクトリの一覧を一度に取得する
      • 9.4.7 指定フォルダにあるディレクトリの一覧を列挙する
      • 9.4.8 指定フォルダにあるファイルの一覧を一度に取得する
      • 9.4.9 指定フォルダにあるファイルの一覧を列挙する
      • 9.4.10 ディレクトリとファイルの一覧を一緒に取得する
      • 9.4.11 ディレクトリとファイルの更新日時を変更する
    • 9.5 パス名の操作
      • 9.5.1 パス名を構成要素に分割する
      • 9.5.2 相対パスから絶対パスを得る
      • 9.5.3 パスを組み立てる
    • 9.6 その他のファイル操作
      • 9.6.1 一時ファイルを作成する
      • 9.6.2 特殊フォルダのパスを得る
    • 第9章の演習問題

    Chapter 10 正規表現を使った高度な文字列処理

    • 10.1 正規表現とは?
    • 10.2 文字列の判定
      • 10.2.1 指定したパターンに一致した部分文字列があるか判定する
      • 10.2.2 指定したパターンで文字列が始まっているか判定する
      • 10.2.3 指定したパターンで文字列が終わっているか判定する
      • 10.2.4 指定したパターンに完全に一致しているか判定する
    • 10.3 文字列の検索
      • 10.3.1 最初の部分文字列を見つける
      • 10.3.2 一致する文字列をすべて見つける
      • 10.3.3 Matchesメソッドの結果にLINQを適用する
      • 10.3.4 一致した部分文字列の一部だけを取り出す
    • 10.4 文字列の置換と分割
      • 10.4.1 Regex.Replaceメソッドを使った簡単な置換処理
      • 10.4.2 グループ化を使った置換
      • 10.4.3 Regex.Splitメソッドによる分割
    • 10.5 さらに高度な正規表現
      • 10.5.1 量指定子
      • 10.5.2 最長一致と最短一致
      • 10.5.3 前方参照構成体
    • 第10章の演習問題

    Chapter 11 XMLファイルの操作

    • 11.1 サンプルXMLファイル
    • 11.2 XMLファイルの入力
      • 11.2.1 特定の要素を取り出す
      • 11.2.2 特定の要素をキャストして取り出す
      • 11.2.3 属性を取り出す
      • 11.2.4 条件指定でXML要素を取り出す
      • 11.2.5 XML要素を並べ替える
      • 11.2.6 入れ子になった子要素を取り出す
      • 11.2.7 子孫要素を取り出す
      • 11.2.8 匿名クラスのオブジェクトとして要素を取り出す
      • 11.2.9 カスタムクラスのオブジェクトとして要素を取り出す
    • 11.3 XMLオブジェクトの生成
      • 11.3.1 文字列からXDocumentを生成する
      • 11.3.2 文字列からXElementを生成する
      • 11.3.3 関数型構築でXDocumentオブジェクトを組み立てる
      • 11.3.4 コレクションからXDocumentを生成する
    • 11.4 XMLの編集と保存
      • 11.4.1 要素を追加する
      • 11.4.2 要素を削除する
      • 11.4.3 要素を置き換える
      • 11.4.4 XMLファイルへの保存
    • 11.5 XMLでペア情報を扱う
      • 11.5.1 ペア情報一覧をXMLに変換する
      • 11.5.2 ペア情報を属性として保持する
      • 11.5.3 ペア情報を読み込む
      • 11.5.4 DictionaryオブジェクトをXMLに変換する
      • 11.5.5 XMLファイルからDictionaryオブジェクトを生成する
    • 第11章の演習問題

    Chapter 12 シリアル化,逆シリアル化

    • 12.1 オブジェクトをXMLデータで保存,復元する
      • 12.1.1 オブジェクトの内容をXML形式で保存する
      • 12.1.2 シリアル化したXMLデータを復元する
      • 12.1.3 コレクションオブジェクトのシリアル化と逆シリアル化
    • 12.2 アプリケーション間でXMLデータの受け渡しをする
      • 12.2.1 XmlSerializerを使ったシリアル化
      • 12.2.2 XmlSerializerを使った逆シリアル化
      • 12.2.3 XmlIgnore属性でシリアル化の対象から除外する
      • 12.2.4 属性で要素名(タグ名)を既定値から変更する
      • 12.2.5 XmlSerializerを使ったコレクションのシリアル化
      • 12.2.6 XmlSerializerを使ったコレクションの逆シリアル化
    • 12.3 JSONデータのシリアル化と逆シリアル化
      • 12.3.1 JSONデータへのシリアル化
      • 12.3.2 JSONデータの逆シリアル化
      • 12.3.3 DictionaryからJSONデータへのシリアル化
      • 12.3.4 JSONデータからDictionaryへの逆シリアル化
    • 第12章の演習問題

    Chapter 13 Entity Frameworkによるデータアクセス

    • 13.1 Entity FrameworkのCode Firstを利用する
    • 13.2 プロジェクトの作成
      • 13.2.1 プロジェクトの新規作成
      • 13.2.2 NuGetによるEntity Frameworkのインストール
    • 13.3 エンティティクラス(モデル)の作成
    • 13.4 DbContextクラスの作成
      • 13.4.1 BooksDbContextクラスの作成
      • 13.4.2 データベース接続文字列の確認
    • 13.5 データの追加
      • 13.5.1 データの追加
      • 13.5.2 作成されたDBを確認する
    • 13.6 データの読み取り
    • 13.7 再度,データの追加
      • 13.7.1 Authorsのみを追加する
      • 13.7.2 登録済みのAuthorを使い書籍を追加する
    • 13.8 データの変更
    • 13.9 データの削除
    • 13.10 高度なクエリ
    • 13.11 関連エンティティの一括読み込み
    • 13.12 データ注釈と自動マイグレーション
      • 13.12.1 データ注釈
      • 13.12.2 自動マイグレーション
    • 第13章の演習問題

    Chapter 14 その他のプログラミングの定石

    • 14.1 プロセスの起動
      • 14.1.1 プログラムの起動
      • 14.1.2 プロセスの終了を待つ
      • 14.1.3 ProcessStartInfoクラスを用いて細かな制御をする
    • 14.2 バージョン情報の取得
      • 14.2.1 アセンブリバージョンを得る
      • 14.2.2 ファイルバージョンを得る
      • 14.2.3 UWPでのパッケージバージョン(製品バージョン)を得る
    • 14.3 アプリケーション構成ファイルの取得
      • 14.3.1 appSettings情報の取得
      • 14.3.2 アプリケーション設定情報の列挙
      • 14.3.3 独自形式のアプリケーション設定情報の取得
    • 14.4 Http通信
      • 14.4.1 DownloadStringメソッドでWebページを取得する
      • 14.4.2 DownloadFileメソッドでファイルをダウンロードする
      • 14.4.3 DownloadFileAsyncメソッドによる非同期処理
      • 14.4.4 OpenReadメソッドでWebページを取得する
      • 14.4.5 RSSファイルの取得
      • 14.4.6 パラメータを渡して情報を取得する
    • 14.5 ZIPアーカイブファイルの操作
      • 14.5.1 アーカイブからすべてのファイルを抽出する
      • 14.5.2 アーカイブに格納されているファイルの一覧を得る
      • 14.5.3 アーカイブから任意のファイルを抽出する
      • 14.5.4 指定ディレクトリ内のファイルをアーカイブする
    • 14.6 協定世界時とタイムゾーン
      • 14.6.1 現地時刻とそれに対応するUTCを得る
      • 14.6.2 文字列からDateTimeOff setに変換する
      • 14.6.3 指定した地域のタイムゾーンを得る
      • 14.6.4 タイムゾーンの一覧を得る
      • 14.6.5 指定した地域の現在時刻を得る
      • 14.6.6 日本時間を指定した現地時間に変換する
      • 14.6.7 A地域の時刻をB地域の時刻に変換する
    • 第14章の演習問題

    Part 4 C#プログラミングのイディオム/定石&パターン[ステップアップ編]
  • Chapter 15 LINQを使いこなす
    • 15.1 本章で利用する書籍データなどについて
    • 15.2 入力ソースが1つの場合のLINQ
      • 15.2.1 ある条件の中の最大値を求める
      • 15.2.2 最小値の要素を1つだけ取り出す
      • 15.2.3 平均値以上の要素をすべて取り出す
      • 15.2.4 重複を取り除く
      • 15.2.5 複数のキーで並べ替える
      • 15.2.6 複数の要素のいずれかに該当するオブジェクトを取り出す
      • 15.2.7 GroupByメソッドでグルーピングする
      • 15.2.8 ToLookupメソッドでグルーピングする
    • 15.3 入力ソースが複数の場合のLINQ
      • 15.3.1 2つのシーケンスを結合する
      • 15.3.2 2つのシーケンスをグルーピングして結合する
    • 第15章の演習問題

    Chapter 16 非同期/並列プログラミング

    • 16.1 非同期処理,並列処理の必要性
    • 16.2 async/await以前の非同期プログラミング
      • 16.2.1 Threadを使った非同期処理
      • 16.2.2 BackgroundWorkerクラスを使った非同期処理
      • 16.2.3 Taskクラスを使った非同期処理
    • 16.3 async/awaitを使った非同期プログラミング
      • 16.3.1 イベントハンドラを非同期にする
      • 16.3.2 非同期メソッドを定義する
    • 16.4 HttpClientを使った非同期処理(async /awaitの応用例)
      • 16.4.1 HttpClientの簡単な例
      • 16.4.2 HttpClientの応用
    • 16.5 UWPにおける非同期IO処理
      • 16.5.1 ファイルピッカーを使ってファイルにアクセスする
      • 16.5.2 ローカルフォルダにテキストファイルを出力する
      • 16.5.3 ローカルフォルダにあるテキストファイルを読み込む
      • 16.5.4 アプリをインストールしたフォルダからファイルを読み込む
    • 16.6 並列処理プログラミング
      • 16.6.1 PLINQによる並列処理
      • 16.6.2 Taskクラスを使った並列処理
      • 16.6.3 HttpClientでの並列処理
    • 第16章の演習問題

    Chapter 17 実践オブジェクト指向プログラミング

    • 17.1 ポリモーフィズムの基礎
      • 17.1.1 継承を使ったポリモーフィズム
      • 17.1.2 インターフェイスを使ったポリモーフィズム
    • 17.2 Template Methodパターン
      • 17.2.1 ライブラリとフレームワーク
      • 17.2.2 テキストファイルを処理するフレームワーク
      • 17.2.3 テキストファイル処理のフレームワークの実装
      • 17.2.4 フレームワークの利用(アプリケーションの作成)
      • 17.2.5 プログラムを実行する
    • 17.3 Strategyパターン
      • 17.3.1 距離換算プログラムを再考する
      • 17.3.2 Converterに共通するメソッド,プロパティを定義する
      • 17.3.3 Converterの具象クラスを定義する
      • 17.3.4 距離の単位変換を担当するクラスを定義する
      • 17.3.5 オブジェクト生成を一元管理する
      • 17.3.6 プログラムを完成させる
    • 第17章の演習問題

    Chapter 18 スタイル,ネーミング,コメント

    • 18.1 スタイルに関する指針
      • 18.1.1 構造をインデントに反映させる
      • 18.1.2 括弧を使ってわかりやすくする
      • 18.1.3 空白の一貫性を保つ
      • 18.1.4 1行に詰め込みすぎない
    • 18.2 ネーミングに関する指針
      • 18.2.1 Pascal形式とCamel形式を適切に使う
      • 18.2.2 それが何を表すものか説明する名前を付ける
      • 18.2.3 正しいつづりを使う
      • 18.2.4 ローカル変数の省略形は誤解のない範囲で利用する
      • 18.2.5 ローカル変数の1文字変数は用途を絞る
      • 18.2.6 変数名/プロパティ名は名詞が良い
      • 18.2.7 bool型であることがわかる名前にする
      • 18.2.8 メソッド名には動詞を割り当てる
      • 18.2.9 好ましくない名前
    • 18.3 コメントに関する指針
      • 18.3.1 コメントにはわかりきったことは書かない
      • 18.3.2 クラスやメソッドのコメントには概要を書く
      • 18.3.3 コードから読み取れない情報をコメントに書く
      • 18.3.4 ダメなコードにコメントを書くよりコードを書き換える
      • 18.3.5 コメントは必要最低限にする
      • 18.3.6 コードをコメントアウトしたままにしない
      • 18.3.7 見た目を重視した形式のコメントは書かない

    Chapter 19 良いコードを書くための指針

    • 19.1 変数に関する指針
      • 19.1.1 変数のスコープは狭くする
      • 19.1.2 マジックナンバーは使わない
      • 19.1.3 変数を使い回してはいけない
      • 19.1.4 1つの変数に複数の値を詰め込まない
      • 19.1.5 変数の宣言はできるだけ遅らせる
      • 19.1.6 変数の数は少なくする
    • 19.2 メソッドに関する指針
      • 19.2.1 ネストは浅くする
      • 19.2.2 return文を1つにしようと頑張ってはいけない
      • 19.2.3 実行結果の状態をint型で返してはいけない
      • 19.2.4 メソッドは単機能にする
      • 19.2.5 メソッドは短くする
      • 19.2.6 何でもできる万能メソッドは作らない
      • 19.2.7 メソッドの引数はできるだけ少なくする
      • 19.2.8 引数にrefキーワードを付けたメソッドは定義しない
      • 19.2.9 引数にoutキーワードを付けたメソッドは可能な限り定義しない
    • 19.3 クラスに関する指針
      • 19.3.1 フィールドは非公開にする
      • 19.3.2 書き込み専用プロパティは定義しない
      • 19.3.3 連続して参照すると異なる値が返るプロパティを定義してはいけない
      • 19.3.4 コストのかかる処理はプロパティではなくメソッドにする
      • 19.3.5 オブジェクトが保持している別のオブジェクトを外にさらしてはいけない
      • 19.3.6 基底クラスをユーティリティメソッドの入れ物にしてはいけない
      • 19.3.7 プロパティを引数代わりにしてはいけない
      • 19.3.8 巨大なクラスは作成しない
      • 19.3.9 new修飾子を使って継承元のメソッドを置き換えてはいけない
    • 19.4 例外処理に関する指針
      • 19.4.1 例外をひねりつぶしてはいけない
      • 19.4.2 例外をthrowする際,InnerExceptionを破棄してはいけない
    • 19.5 その他の好ましくないプログラミング
      • 19.5.1 constの誤用
      • 19.5.2 重複したコード
      • 19.5.3 コピー&ペーストプログラミング
      • 19.5.4 Obsolete属性の付いたクラス,メソッドを使い続ける
      • 19.5.5 不要なコードをそのまま残し続ける
    • Index

    サポート

    ダウンロード

    (2020年6月15日更新)

    本書で使用したサンプルコードおよび演習問題の解答は,以下のリンクをクリックすることでダウンロードできます。

    なお,サンプルコードに一部修正がありました。6月14日以前にダウンロードされた方は,お手数ですが,再度ダウンロードしていただきますよう,お願いいたします。

    ダウンロード
    サンプルコード
    演習問題の解答

    いずれも圧縮ファイルとなっておりますので,解凍すれば利用できるようになります。なお,詳しいことは本書のP.5~P.6をお読みください。

    免責事項

    それぞれのソースコードは,ご自身の責任において使用してください。使用した如何なる結果についても,著者および技術評論社は一切の責任を負いません。

    正誤表

    小社刊『実戦で役立つC#プログラミングのイディオム/定石&パターン』(出井秀行・著/2017年3月3日 初版 第1刷,2017年8月18日 初版 第2刷,2018年12月26日 初版 第3刷,2020年1月9日 初版 第4刷)におきまして,一部の記述に間違いのあることが判明いたしましたので,下記のとおりお知らせいたします。読者の皆様にはご迷惑をおかけし,まことに申し訳ございません。ご容赦くださいますよう,お願い申し上げます。

    (2020年12月4日最終更新)

    以下,第1刷,第2刷,第3刷および第4刷にある誤り
    P.188 本文下から4行目

    指定したキーがにディクショナリに存在しない場合、
    指定したキーディクショナリに存在しない場合、

    (以下2020年9月29日更新)

    P.65 「3. Saleオブジェクトを1つずつ取り出し処理をする」の本文1行目

    foreach 文を使い,_salesディクショナリから
    foreach 文を使い,_salesリストから

    (以下2020年7月9日更新)

    P.29 「1.3 値型と参照型」の本文(上から2~3行目)

    .NET Frameworkに定義されたカスタムクラスや構造体
    .NET Frameworkに定義されたクラスや構造体

    「カスタム」が不要。

    P.356 リスト14-17(空行を含め5行目)

    
    Console.WriteLine("{0}% {0}/{1}", e.ProgressPercentage,
                              e.BytesReceived, e.TotalBytesToReceive);
    
    
    Console.WriteLine("{0}% {1}/{2}", e.ProgressPercentage,
                              e.BytesReceived, e.TotalBytesToReceive);
    

    P.357 リスト14-19(下から3行目)

    
    string s = Regex.Replace(node.Value,"【|】", "");
    yield return node.Value;
    
    
    string s = Regex.Replace(node.Value,"【|】", "");
    yield return s;
    

    P.361 リスト14-24(3~4行目)

    
    ZipFile.CreateFromDirectory(sourceFolder, archiveFile, CompressionLevel.Fastest, 
    				

    includeBaseDirectory: false);
    
    ZipFile.CreateFromDirectory(sourceFolder, archiveFile, CompressionLevel.Fastest, 
    				

    includeBaseDirectory: true);

    P.385 演習問題「7.」の出力例(下から2行目)

    Microsoft Visual C#再入門
    Visual C#再入門

    「Microsoft」が不要。

    P.460 「19.2.1 ネストは浅くする」の本文(上から6行目)

    コードはコードを読み解くのに時間がかかる
    コードを読み解くのに時間がかかる

    先頭の「コードは」が不要。

    (以下2020年5月27日更新)

    以下,第1刷,第2刷,第3刷および第4刷にある誤り

    P.118 コード例を含め上から7行目

    
    には、DefaultNameがnumに代入されます。
    
    
    
    には、DefaultNameがnameに代入されます。
    
    

    P.211 コード例を含め上から8行目(×のコード例の2行目)

    
    Console.WriteLine("2015/12/31以前です。");
    
    
    
    Console.WriteLine("2016/5/31以前です。");
    
    

    (以下2019年11月27日更新)

    以下,第1刷,第2刷および第3刷にある誤り

    P.169 見出し「LINQを使ったコード」の下3行目

    変数isAllPositiveにはtrueが設定されます。
    変数isAllPositiveにはfalseが設定されます。

    (以下2019年11月21日更新)

    P.130 リスト4.48の7行目と8行目(空行含む)

    
    public AppVersion(int major, int minor, int revision) 
        : this(major, minor, revision, 0) {
    
    
    
    public AppVersion(int major, int minor, int build) 
        : this(major, minor, build, 0) {
    
    
    

    (以下2018年7月27日更新)

    以下,第1刷および第2刷にある誤り

    P.116 上から10行目のソースコードの1行目

    
    var message = GetMessage(code)
    
    
    
    var message = GetMessage(code);
    
    

    P.285 リスト11.10の下から6行目

    
    var novelist = ReadNovelists();
    
    
    
    var novelists = ReadNovelists();
    
    

    P.348 本文の下から6行目(ソースコードは除く)

    AssemblyInfo.csに内のAssmblyVersion属性に反映されます。
    AssemblyInfo.cs内のAssmblyVersion属性に反映されます。

    (以下2018年2月19日更新)
    以下,第1刷および第2刷にある誤り

    P.427 リスト17.13中6~7行目

    
    return name.ToLower() == "meter" || name.ToLower() == "meter" || name == UnitName;
    
    
    
    return name.ToLower() == "meter" || name == UnitName;
    
    

    2つ目の「.ToLower() == "meter" || name」が余分でした。


    (以下2017年8月1日更新)
    以下,第1刷および第2刷にある誤り

    P.205 上から2行目

    秒、1/100秒)を含んだ
    秒、1/1000秒)を含んだ

    P.205 リスト8.3の最終行のコメント

    // 1/100秒: Millisecond
    // 1/1000秒: Millisecond

    (以下,2017年6月5日更新)
    以下,第1刷にある誤り

    P.111 リスト4.20の1行目

    
    foreach (var item in Collection) {
    
    
    
    foreach (var item in collection) {
    
    

    (以下,2017年4月19日更新)

    P.169 本文中程およびリスト6.23の2行目

    
    すべての要素が0以上か調べています。
    
    
    
    すべての要素が0より大きいか調べています。
    
    


    (以下,2017年2月13日更新)

    P.320 上から6行目(空行を除く)

    JSONファイルに逆シリアル化する
    JSONファイルにシリアル化する

    P.359 最下行

    
    if (!File.Exists(destinationFolder)) {
    
    
    
    if (!Directory.Exists(destinationFolder)) {
    
    

    P.384 下から2行目~ P.385 上から1行目の枠で囲んだ出力例

    
    2013年 2800円 Webデザイン講座 HTML5&CSS (Web Design)
    2013年 4200円 PowerShell 実践レシピ (Server)
    2014年 3800円 C#開発指南 (Development)
    
    
    
    2016年 4800円 Microsoft Azureサーバー構築 (Serever)
    2016年 2780円 Visual C#再入門 (Development)
    2016年 2600円 Word・Excel実践テンプレート集 (Application)
    
    

    P.399 リスト16.13の上から5行(空行を含む)

    
    private void button1_Click(object sender, RoutedEventArgs e) {
       WriteTexts("sample.txt");
    }
    
    private async void WriteTexts(string filename) {
    
    
    
    private async void button1_Click(object sender, RoutedEventArgs e) {
       await WriteTexts("sample.txt");
    }
    
    private async Task WriteTexts(string filename) {
    
    

    P.406 下から2行目

    
    private async Task<int> DoSomethingAsync() {
    
    
    
    private async Task<long> DoSomethingAsync() {
    
    

    P.407 下から9行目(脚注,空行含まず)

    
    private int DoSomething() {
    
    
    
    private long DoSomething() {
    
    

    P.408 1行目

    
    private async Task<int> DoSomethingAsync() {
    
    
    
    private async Task<long> DoSomethingAsync() {
    
    

    補足情報

    2018年11月現在,執筆時点からC#を取り巻く状況が変わっていますので,以下のとおり補足いたします。

    (2018年11月26日最終更新)

    1 MSDNからMicrosoft Docsへ

    Microsoftは15年にわたって運用してきたドキュメントサイトMSDNを引退させ,新しいドキュメントサイト
    「Microsoft Docs(docs.microsoft.com)」を立ち上げたうえで,そちらにドキュメントを全面移行しています。
    そのため,本書の中のMSDNあるいはMSDNライブラリという用語は,Microsoft Docsと読み替えていただく必要があります。

    Microsoft DocsのトップページのURLは,以下のとおりです。

    なお,本書の脚注などで紹介しているMSDNへのURLにアクセスすると,新しいMicrosoft Docsのページへリダイレクトされます。

    2 Visual Studio 2015という表記に関して

    本書では,執筆時点の最新バージョンであるVisual Studio 2015を使用し,操作手順などを紹介していますが,Visual Studio 2017以降でも同等の機能が利用可能です。

    商品一覧