出版社を探す

C#ショートコードプログラミング

第3版

短いコードで生産性を高める必修テクニック

著:川俣 晶

紙版

内容紹介

 本書は、C#でコードをいかに短く記述するかというアイデアをまとめた解説書で、2011年1月に発行した第2版の改訂版になります。第2版では、C# 5.0の言語仕様で使用可能なLINQを切り札としてコード半分を実現していました。当時はまだLINQは全C#プログラマの共通基盤ではなかったからです。
 この第3版では、C# 7.0の世代までに機能を広げ、以下のアイデアのもとにコードの短縮化を示しています。

・C#の改良により、よりソースコードを短く書くための機能が拡張されている
・LINQを使わない方が短く書けるケースもあるが、意外と盲点になっている
・もっと短く書けるケースを新たに閃くこともある

 具体的には、式化、out変数、値型タプル、null演算子などの機能を使うアイデアを紹介しました。さらに第3版では、気になった項目についてはコードの実行速度にも着目しました。特に注意すべき点はLINQです。LINQは高速ではありません。LINQの多用は速度をスローダウンさせるケースがあります。ですから、より望ましい書き換えとしてLINQ の利用を避けた場合があります。つまり、第2版では「LINQを使って短縮しました」という結論だった事例が、今回は「LINQを使わないようにより短く書き直した」という結論に変化しているものがあります。

目次

はじめに

第1章 基本編(その1)
1.1 ハローワールドすら短くなる新世界Part1
1.2 ハローワールドすら短くなる新世界Part2
1.3 ハローワールドすら短くなる新世界Part3
1.4 ハローワールドすら短くなる新世界Part4
1.5 単純な空白削除が意味を持つ場合
1.6 引数のデフォルト値でオーバーロードを減らす
1.7 foreach ループもSelect メソッド併用で回数がわかる
1.8 条件指定付き繰り返し
1.9 out 変数で独立した宣言を減らす
1.10 TryParseでtry ブロック追放
1.11 結果を判定しないTryParse の用法
1.12 無効を表す数を型のデフォルト値にする
1.13 条件判定の結果を返す
1.14 条件演算子とnull合体演算子
1.15 条件演算子とnull合体演算子とnull条件演算子
1.16 オブジェクトの初期化構文
1.17 後始末の実行予約
1.18 引数にラムダ式
1.19 クエリを2 回使う
1.20 名前を指定したメソッド呼び出し
1.21 出力シーケンス記述の簡素化
1.22 使う直前まで初期化を遅延
1.23 初期化タイミングの強制
1.24 要らない値は書き込み専用変数に捨ててしまえ
1.25 パターンマッチングで判定と型変換を一体に
1.26 よく使う値をローカルで参照
1.27 ローカル関数でスコープ制御
1.28 型のデフォルト値の短縮
1.29 ToStringの短縮
第2章 基本編(その2)
2.1 列挙可能なオブジェクト
2.2 連番の生成
2.3 指定値での配列の初期化
2.4 多重ループ
2.5 変数名の付け方
2.6 日本語変数名の複数形表現
2.7 メソッドに名前は必要か?
2.8 静的メソッド分身の術
2.9 終わりが見えない列挙
2.10 リストボックスのチェック
2.11 ある範囲を抜ける際に確実に処理させたい
2.12 変化する値での初期化
2.13 配列を縮小したい
2.14 配列を拡大したい
2.15 配列に値を挿入したい
2.16 C#でキャストを外せるとき
2.17 swicth文自由自在
2.18 型変換するswitch文
2.19 goto文の使い所
2.20 自動プロパティと初期化
2.21 自動プロパティでreadonly追放
2.22 using staticでクラス名省略
2.23 関係ある例外だけキャッチ
2.24 型を宣言しながらタプルを使う
2.25 例外発生を式の内部で
第3章 日付時刻ハンドリング
3.1 先月は何月?
3.2 月末の日付は?
3.3 経過期間を知る
3.4 素早くTimeSpanオブジェクトを得る
第4章 コレクションハンドリング
4.1 配列を使うとき、コレクションを使うとき
4.2 1回のクエリに詰め込む
4.3 TryGetでtryブロック追放
4.4 配列の初期化構文
4.5 Listクラスの迅速初期化
4.6 Dictionaryクラスの迅速初期化
4.7 日付時刻のソート
4.8 規則性のある値で配列を初期化
4.9 配列の値が繰り返される値で初期化された配列
4.10 乱数で初期化された配列が欲しい
4.11 Dictionary クラスの値だけ列挙したい
4.12 キーと値の両方を列挙したい
4.13 参照型のコレクションの型変換
4.14 値型のコレクションの型変換型
4.15 雑多な型のデータを含むコレクションから特定の型のデータだけ扱う
4.16 レンジで追加する
4.17 素早くオブジェクトを分類
4.18 重複のない和集合
4.19 型のない列挙
4.20 char 配列の文字列化
第5章 LINQ ハンドリング
5.1 ループなしで塊をさばくPart-1
5.2 ループなしで塊をさばくPart-2
5.3 1個だけ手に入れば十分
5.4 1個も見つからない場合も動作を一致
5.5 型のデフォルト値も有効なデータだよ
5.6 参照型でも型のデフォルト値も有効なデータだよ
5.7 最後の1個を取得せよ
5.8 最小・最大・平均値
5.9 先頭の項目を読み飛ばしたい
5.10 先頭の項目だけ読み込みたい
5.11 合計値の計算
5.12 配列値の全検査
5.13 新着リストを出したい
5.14 ゴミデータを読み飛ばせ
5.15 開始マークと終了マークの間
5.16 列挙からコレクションへ
5.17 2つの配列から計算
5.18 3つの配列から計算
5.19 ソートの革新
5.20 ListクラスのインスタンスにToListする
5.21 Main メソッド以外でコマンドラインを参照したい
5.22 配列の合体
5.23 配列が空なら型のデフォルト値
5.24 配列が空なら「ありません」を出力する
5.25 一人だけ代表を選ぶ
5.26 同じものは登録させない
5.27 このシーケンスの最後からn番目
5.28 空のシーケンス頂戴
5.29 指定値は取り除いてよ
5.30 共通要素だけ欲しい
5.31 危険なシーケンス反転
5.32 シーケンスの一致判定
5.33 参照型シーケンスの一致判定
5.34 シーケンスの和集合
5.35 たった1つ
5.36 読み出し専用のリストに値を1つ追加したい
第6章 文字列ハンドリング
6.1 文字列連結に+ を使ってもいい場合
6.2 書式付き文字列連結
6.3 書式付き文字列追加
6.4 書式付き文字列出力
6.5 IsNullOrWhiteSpaceの活用
6.6 IsNullOrEmptyの活用
6.7 ある文字を使っていないことを調べる
6.8 文字列を分割する
6.9 あれとこれとそれ
6.10 整数と文字列をジョインしたい
6.11 配列から単なる文字列合体をさせたい
6.12 Replaceで一括置き換え
6.13 書式整形をスマートに
6.14 書式整形機能を持たない出力先に整形
6.15 Trim三段活用
6.16 文字列を右寄せした文字列がほしい
6.17 例外の多い文字リスト
6.18 2つのContainsの罠
第7章 ファイルハンドリング
7.1 パスの結合
7.2 配列からパスを生成する
7.3 テキストファイル全体の読み込み
7.4 列挙としてのテキストファイル全体の読み込み
7.5 文字列全体の書き込み
7.6 列挙される文字列の書き込み
7.7 ディレクトリ作成
7.8 ディレクトリの削除
7.9 ファイルの削除
7.10 拡張子の判定
7.11 絶対パスの判定
7.12 長いパスをソースに書きたい
7.13 5個のファイルの最初の1ファイルの名前
7.14 ディレクトリの列挙
7.15 ファイルの再帰探索
7.16 バックアップファイルの作成
7.17 バイナリーファイルの読み書き
7.18 メモリのクローズ
7.19 メモリへの書き込み
7.20 実行ファイルのフルパスの取得
第8章 JSON/XML ハンドリング
8.1 XmlReaderを作成する
8.2 XmlWriterを作成する
8.3 XmlWriterでEndを略する
8.4 決まったXM 文書を作成する
8.5 XNameオブジェクトを作成したい
8.6 XML文書フラグメントの挿入
8.7 ソースにXML文書を埋め込みたい
8.8 JSONに出力する
8.9 定義のないオブジェクトをJSONとして書き出す
8.10 未知のJSONファイルを読み込む
第9章 タスクハンドリング
9.1 値の積算
9.2 初期化を遅延したい
9.3 初期化を遅延したいが型は変更できない
9.4 タスクごとのカウント
第10章 非同期ハンドリング
10.1 非同期のハローワールド
10.2 非同期にコンソールから1行入力
10.3 async禁止のメソッド
10.4 同期メソッドを非同期呼び出ししたい
10.5 呼びっぱなしの非同期呼び出し
10.6 非同期のParallel.Invoke
10.7 catch とfinallyブロック中のawait
第11章 エンコーディングハンドリング
11.1 シフトJISからEUC-JPに変換する
11.2 エンコード結果の配列確保
11.3 変換できない文字があるときに例外
11.4 コードページの番号を活用する
第12章 ミサレイニアス
12.1 GACのメソッド一覧
12.2 ここでもLINQ
12.3 任意オブジェクトのキャッシュを実装したい
12.4 リソース処理
12.5 バージョン管理
12.6 バージョン番号の取得
12.7 ラムダ式を使った時の引数の軽減
12.8 Tupleの利用
第13章 ケーススタディ
13.1 Quoted-Printableの処理
13.2 テキストファイルを逆順で読み出す
13.3 大文字小文字を無視したDictionary
13.4 Re: の除去
13.5 そこにいるのは誰か?
13.6 プラグインの設定をファイルに保存する
13.7 すべての型を列挙する
第14章 ヒント
14.1 なぜ短く書くのか
14.2 C# 2001対C# 202X
14.3 C#が持つ「方法は1つではない」という特徴
14.4 なぜ短く書くことへの抵抗があるのか
14.5 小手先のテクニックは使うな
14.6 知らない機能、使ったことがない機能への忌避感
14.7 LINQ多用は速度低下を招く
14.8 プロパティの悪夢
14.9 構造体の悪夢・速度検証の悪夢
14.10 速度をスローダウンさせない書き換え
14.11 nameof式は短くすべきではない
14.12 テストファーストとテスト駆動開発
14.13 ステート集約プログラミング
14.14 KISSの原則
付録A デバッガと値の確認の問題
付録B ショートコードのヒント

索引

ISBN:9784822253738
出版社:日経BP
判型:B5変
ページ数:416ページ
定価:3400円(本体)
発行年月日:2018年03月
発売日:2018年03月31日
国際分類コード【Thema(シーマ)】 1:UB