独習C# 第5版　を読んだレビュー

# はじめに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47146/35234935-0524-24cc-195d-3c19eb469358.png)

このたび、[独習C# 第5版](https://www.shoeisha.co.jp/book/detail/9784798175560)を著者の山田祥寛さんよりご献本いただきました。
今回はこちらの書籍についてレビューをしていきます。

# 書籍について

[独習C# 第5版](https://www.shoeisha.co.jp/book/detail/9784798175560)はタイトルのとおり、`C#`について解説されている技術書です。
`C#`の基礎となる`.NET`環境の解説からはじまり、基礎的な概念、制御構文、標準ライブラリ、踏み込んだ上級者向けの機能と網羅的に解説しています。

また最新の`C# 10`にも対応しており、`C#7`以降に登場した機能については目次や章題にそのことが明記してあります。
このため**すでにC#についてある程度触れている方が、最新のC#に追いつくための学習資料として使うこともできるようになっています。**

## この書籍の特徴

* `C#`の言語機能について網羅して解説している
    * 2022年時点で最新の`C# 10`の機能にも対応
    * `C# 7`以降に登場した機能については目次や章題で把握できるようになっている
* 各章の最後に理解度チェックテストがある
    * 用語チェックや正誤問題、条件を満たすコードを実際に書くなど、多様な問題が出る

このためただの技術解説書としてではなくタイトルのとおり、**C#を独習するための教科書＆問題集**として活用できるようになっています。

## この書籍をお勧めできる人

**◎非常にお勧めできる人達**

* 「ITの基礎知識」は習得済みであり、はじめてのプログラミング言語として`C#`を学ぼうとする人
* `C#`**以外の**言語をすでに習得済みで、これから`C#`の学習を始める人
* 一昔前の`C#`には触れたことがあり、最新の`C#`にこれから追いつこうとしている人

**△他の技術書も併用するとよいかも、という人達**

* IT関係の経験やPCに触れたことすらまったく無く、本当にこれからプログラミングを始めようとする人
* `C#`を用いている特定のフレームワーク/ツール（`ASP.NET`や`Unity`など）の使い方を覚えるのが目的の人


こちらの書籍は「`C#`について網羅的に理解し、`C#`のプロフェッショナルとして成長すること」を目的としています。
そのため「`C#`を通してプログラミングを学習するぞ」という**強い意志**がある人にはとてもお勧めできる書籍となっています。

一方でPCの使い方すらわからず、「おんぶに抱っこでゼロからプログラミングを勉強したい」「困った時は誰かに答えを教えて欲しい」という人には難しいかもしれません。
書籍名とおり「`C#`を勉強したい」という意志のもと独習できる人のための内容となっています。

また特定のフレームワークやツールの使い方を紹介する書籍でもありません。
純粋な`C#`の言語機能について学ぶための書籍であり、フレームワークやツールの機能についての学習には別の技術書を併用することをお勧めします。


# 書籍の内容について

各章を読んで目についた章や項について紹介します。
**ここに挙げられている項目以上に書籍では詳細に語られています。あくまでここに記載したのは「自分が気になった部分」の抜粋です。**

## 第1章イントロダクション

第1章はこれから`C#`を触れる人に向けて、`C#`の言語を取り巻く環境や概念、用語について解説しています。

 * `C#`という言語の特徴
 * `.NET`環境、共通ランタイム、基本クラスライブラリについて
 * `VisualStudio`を用いた環境構築
 * サンプルコードの実行、デバッグ方法
 * `C#`におけるソースコードの名称

`C#`を取り巻く環境や用語についてざっと触れており、流れに沿えば環境構築から実行まで行えるようになっています。

## 第2章C#の基本

第2章は`C#`の基本として、主にデータの「型」について解説しています。

 * 変数や定数の宣言、命名規則
 * 組み込み型
 * 値型と参照型（ポインタ型とUnsafeコード）
 * 値型
    * 整数型、浮動小数点、文字型、真偽型、オブジェクト型
 * 型推論(`var`)
 * リテラル
    * 整数リテラル、浮動小数点リテラル、文字リテラル、文字列リテラル
 * 型変換（キャスト）
 * 参照型
    * クラス型、null値、null許容型
 * **null許容参照型**
 * 配列型

`C#`で登場する各種型やその仕組、扱い方について網羅的に説明しています。
`C# 7`で追加された数値セパレータなど、自分も把握していなかった機能について知ることができました。


## 第3章演算子

第3章は「演算子」について説明しています。

* 算術演算子（四則演算子、余剰、前置加算や後置加算など）
* 代入演算子
* 関係演算子（比較演算子）
* 論理演算子
* ビット演算子
* その他演算子(`sizeof`,`nameof`)
* 演算子の優先順と結合則

同値性と同一性の違い、浮動小数点の演算誤差や比較についての注意点など、`C#`で陥りやすい罠についてもしっかり解説されています。

## 第4章制御構文

第4章は構造化プログラミングのための制御文について説明しています。

* 条件分岐
 * if文、switch文、switch文によるパターンマッチング、switch式
* 繰り返し処理
 * do、while、for、foreach
* ループの制御
 * break、continue
* その他
 * goto
 * プリプロセッサディレクティブ（`#if`、`#region`など）

単に制御構文を説明するだけでなく、読みやすいコードを書くテクニックがいくつか紹介されています。
サンプルコードも多く記載されているため、初学者の人でも理解しやすい内容になっています。


## 第5章標準ライブラリ

第5章では`.NET`が提供するクラスライブラリについての紹介となっています。

 * 文字列操作（`string`）
    * 長さの取得、文字列検索、文字列の分割など
 * **正規表現**(`Regex`)
 * 日付/時刻（`DateTime`）
 * ファイル操作（`System.IO`）
 * その他
    * `Math`や`Random`
    * `Array`、**`Span<T>`**(`C#7.2`)


第4章までと違い、ある目的に対して逆引き的に対応する機能が紹介されています。
そのため「これどうやるんだっけ」となったときに何度も参照することになる章となるでしょう。
（とくに正規表現についてはかなりページ数を割いて説明されており、より実用的な内容となっています）

## 第6章コレクション

第6章では主に`System.Collections.Generic`周辺の機能説明がされています。

 * ジェネリック構文
 * `List`
 * `LinkedList`
 * `Stack`
 * `Queue`
 * `Set`
 * `SortedSet`
 * `Dictionary`
 * `SortedDictionary`
 * `SortedList`

各種コレクションの概念が解説されており、それぞれの強み弱みも解説されています。
とくにそれぞれが図解されているのが素晴らしいです。

## 第7章オブジェクト指向構文（基本）

第7章では「クラス」を使うために必要な知識について解説しています。

* クラス定義
 * 名前、アクセス修飾子
* フィールド
* メソッド
* コンストラクター
* クラスメソッド/クラスフィールド
* 引数/戻り値の記法
   * タプル（`ValueTuple`）

ここに記載した目次はだいぶ端折ってるため簡素に見えますが、実際はこの「第7章クラス」だけで**80ページ近く**のページ数が割かれています。
そのためクラス定義についての細かい挙動やテクニックについてしっかりと掘り下げされており、ここを熟読すれば`C#`のクラスについては完璧に把握できるでしょう。


## 第8章オブジェクト指向構文（カプセル化/継承/ポリモフィズム）

第8章はオブジェクト指向プログラミングを学ぶ上で重要な概念について解説しています。

* カプセル化
 * アクセス修飾子（`C#7.2`で追加された`private protected`も解説）
 * プロパティ
* 継承
 * 継承の基礎
 * メソッドの隠蔽、オーバーライド
 * パターンマッチング（`C#8.0`/`C#9.0`の内容含む）
 * 拡張メソッド
* ポリモフィズム
 * 抽象クラス、インタフェース
 * インタフェースのデフォルト実装（`C#8.0`）

第8章はクラスを使いこなす上で重要な概念や機能についてかなり丁寧に説明しています。
「継承はどのようなタイミングで使うべきか」「抽象クラスとインタフェースの使い分けとは」といった初学者が迷いそうな部分もしっかりと解説しています。

## 第9章オブジェクト指向構文（名前空間/例外処理/ジェネリックなど）

第9章はクラスやインタフェースを支えるさまざまな仕組みについて説明しています。

* 名前空間
* 例外処理
* 列挙型
* 構造体
* **レコード型**（`C#9.0`）
* **レコード構造体**（`C#10.0`）
* 入れ子クラス/パーシャルクラス
* ジェネリック
  * 共変と反変
* オブジェクトクラス
  * ボクシング/アンボクシング
* 演算子のオーバーロード

第9章は`C#`の中級者以上はマストで把握しておかないといけない機能群を解説しています。
特に動作パフォーマンス、コードの読みやすさ、メンテナンス性などに直結する内容が詰まっています。
**`C#`に慣れてきた人が、一歩先へ進むために読むべき章はここ**だと思いました（もちろん１～８章も重要ですけど）

## 第10章ラムダ式/LINQ

第9章はラムダ式とLINQについて紹介しています。

* デリゲート
* 匿名メソッド
* ラムダ式
 * 外部変数のキャプチャ
* ラムダ式を伴う`List<T>`クラスのメソッド
* LINQ（`LINQ to Objects`）
 * 各種LINQメソッドをサンプルコードを用いて解説

LINQはめちゃくちゃ強力なの機能のため、`C#`を始めたばかりの人には真っ先に覚えて欲しいテクニックです（ごちゃごちゃとした`for`や`foreach`を書きがちの人はとくに）。
とはいえどLINQを使いこなすためにはまず「ラムダ式」から抑える必要があり、書籍でもそれを意識された構成となっています。

## 第11章高度なプログラミング

最終章となる第11章では、今までの話の流れとは外れた、しかし重要な機能について紹介しています。

* マルチスレッド処理
 * 排他制御
 * `volatile`
 * `async/await`
 * 非同期ストリーム/非同期イテレーター（`C#8.0`）
* 属性（`Attribute`）
 * `Conditional`
 * `CallerXXXXX`
 * null許容に関する属性
 * リフレクション
* `dynamic`型
* イベント

第11章の内容は人によってはほとんど触れたことがない、知らないという機能が多いかもしれません。
（自分も`volatile`や`CallerXxxxAttribute`は知らなかったです）
とはいえど決して無視することはできない機能であるため、途中で諦めずに第11章まで読破してほしいです。
（とくに`async/await`は今の時代、絶対に避けては通れない機能なため）


# 全体を通して

## 良かったところ

まず全体として**とても読みやすいです。**

説明に妥協がなく複雑な機能や概念も図を用いてすごく丁寧に解説されています。
まるで先生が丁寧に講義してくれているかのような感覚になりました。また各章や項目ごとに「練習問題」が用意されているため、理解度を確認しながら確実に先に進むといったことができます。

タイトルのとおりまさに「独習」するのにこれ以上わかりやすい`C#`本は無いだろうと思います。それでいて`C#`の最新機能含め、各機能を網羅的に解説されているため`C#`のリファレンスとしても便利に使えます。

一度読んで終わりではなく、`C#`をある程度書けるようになったあとでもずっと手元において置きたくなる内容でした。

## 良くなかったところ

正直、読んでいてこれといった不満はありませんでした。「初心者がスキルアップしてより高度で実践的な内容を身につける」というコンセプトに相応しいと感じました。

## さらにC#の学習を進めるなら

本書は`C#`についてきれいにまとめており、これ一冊で`C#`の中～上級者を目指せる内容です。

とはいえど`C#`の世界は深く、突き詰めると本書では語られてない機能や概念が山ほどあったりします。より`C#`を極めるためには`.NET`や`CLR`の挙動や仕組みを掘り下げる必要があったりします。また`C#`という言語機能だけでなく、`C#`を用いたツールやフレームワークを使いこなすためには。そちらを専攻して学習する必要があります。

本書は「`C#`を使いこなすための手助け」として非常に優秀です。ですが、これ一冊だけで`C#`の学習が終わるわけではありません。より高みを目指すのであれば本書を土台に、さらに専門的な書籍に手を伸ばしてみることをオススメします。
（少なくともこの本を読破してマスターすれば、そのような専門的な書籍も読み込めるようになっていると思います。）

# まとめという感想

自分自身、実は今まで「`C#`の言語について解説されている技術書」を読んだことがありませんでした。他の言語の知識や感覚で`C#`を使っていたのもあり、今回あらためて`C#`全体を俯瞰して学習することができました。

自分は`C#`歴が10年ほどありますが、それでも知らなかった機能はちょこちょこあったりしました。最新の`C#10`の内容も含まれているのもあり、ちょうど知りたかった内容（レコード構造体とか）について学習できてよかったです。

ということで[独習C# 第5版](https://www.shoeisha.co.jp/book/detail/9784798175560)ですが、とてもよい書籍です。`C#`をこれから学習するという人ももちろん、なんとなく`C#`を書けてはいるけどちゃんと学び直したい人、最新版の`C#`に追いつきたい人、など幅広い人に刺さる内容だと思いました。