独習C 新版のレビュー記事です。本の分量自体が索引含め606ページととても読み応えのあるものだったため、読んだ感想(ざっくり)からだんだん詳細が伝わるように書いていこうと思います。
全部読み、各章についているの理解を確認するための問題も一通り考えてみました。
こういう人が読むといいかも
普段業務や趣味でC#である程度意図通り動作するアプリケーションを書いているが…
- 人のコードを読んでいて構文的にわからないことがある
- 動くけどなんでそれが構文的に正しいかよくわかってないなぁと思うことがある
- いつも手に馴染んだ書き方で書いているが、他にも書き方ありそうなので打ち手を増やしたい
- C#を体系的に勉強したいけどなにを「体系的」とするか一例を見てみたい
書いたことがあるけど、動いている部分を説明できるように「基礎」を勉強し直したいときに読むとよさそうです。
僕自身が読むにあたっては理解や知識に漏れがる部分がどんどん埋まっていく感じがしました。
こんな人が読むのは厳しいかも・向いてないかも・書いてないかも
- デスクトップアプリ、モバイルアプリ、Webアプリケーションのフレームワークの使い方が知りたい
- Visual Studioを使いこなしたい
- はじめてC#を書くにあたってC#の概要を知りたい
はじめてC#に触れる人がこの本を読むのはちょっとしんどいと思いました。
C#経験が少ない人のことも意識されてますが、網羅的かつ詳細に説明されているだけに、どれも大事なことのように思えて読み終わらなさそうです。優先度の甲乙がつけがたい。
レビューを書く人(自分)のC#歴
C#との接点
- 2015年夏くらいから業務でWPFのアプリ開発を半稼働くらいで開始
- 2016年は半分と少しくらいWPFアプリ開発に従事
- 2017年は7割くらいXamarin(Macアプリと趣味でモバイルアプリ)とWPFとAWS LambdaでC#を触る
読んだ本
- Xamarin本一通り
あとC#本何冊か部分部分読みました。
- 実戦で役立つ Cプログラミングのイディオム/定石&パターン
- 改訂3版 パーフェクトC (PERFECT SERIES 1)
- チーム開発の教科書 Cによるモダンな開発を実 践しよう!
- C実践開発手法 (マイクロソフト公式解説書)
特徴的なところ・いいなと思ったところ
似た使い方をする構文の違いの説明が詳しい
- ジャグ配列と多次元配列の
Length
の違い ==
とEquals
の違い&
と&&
の違いRegex
のインスタンスメソッドとクラスメソッドの違いreadonly
とconst
の違いFile
/Directory
とFileInfo
/DirectoryInfo
の違い- 値型の値渡し、参照型の値渡し、値型の参照渡し、参照型の参照渡しの違い
List
とLinkedList
の使い分けLINQ
のクエリ構文とメソッド構文の違い- 匿名型とタプルの用途の違い
interface
と抽象クラスの使い分けDynamicObject
、ExpandoObject
の使い分け
本文中で説明されているものもあれば、「エキスパートに訊く」という特設コーナーでQA形式で説明されているものもあってとても勉強になりました。
使っているはずだけど知らなかったことが振り返れる
if
、while
、do while
の{...}
省略時の意図していないはずの挙動- フィールドの初期化子、コンストラクター、オブジェクトの初期化子の初期化の順番
- C#6からラムダ式で書けるようになったメンバーの一覧
Sprit
メソッドでseparatorなしの場合はIsNullOrWhiteSpace
相当区切り- 正規表現で最長一致・最短一致させるための書き方
Stack
はforeach
で取り出すときも後ろから取り出す- 構造体使用が妥当なケース
- ハッシュテーブルへのアクセス効率
自明なものとして表立って説明されることはなかったり省かれたりすることが多いけど概念的に大事なことを一言で言い表した上でC#の実装や図表と合わせて説明されている
- サロゲートペア
- バッファー
- コレクション
- スタック
- キュー
- セット
- ディクショナリ、マップ、ハッシュ、連想配列
- ジェネリック
- アセンブリ
- ストリーム
- シグニチャ
- スレッド
- プロセス
ラムダ式登場の経緯
デリゲート型にをより簡素に書くためにラムダ式が登場した背景が具体的なコードと共に説明された上で、ラムダ式をよく使うLINQの説明がなされていてとても頭に入ってきやすかったです。
この部分に限らず、全体的に単に使い方だけでなく構文登場の背景や、以前のC#バージョンではこう書いていたが今はこう書けるので今後はこう書いていくべきのようにC#をとりまく歴史の中で説明されているので頭がスッキリしました。
全然知らなかった、考えてみたこともなかった…
volatile
- 属性や動的オブジェクト(
DynamicObject
派生クラス)を自分で定義して使う - .NET FrameworkでPythonを動作させる(
IronPython
) - マルチキャストデリゲート
- 演算子のオーバーロード
章毎の確認問題
章毎に理解度を確認するための問題がついています。
コードを書く以外の問題(◯×問題)を掲載するので、試しに確認してみてください。答えが気になる方は是非本でどうぞ!
※章途中の小問題もけっこうあるのでここに掲載する倍以上の問題とその解説が載っています。
- 1章
- C#の特徴を「マルチパラダイム」「マルチプラットフォーム」というキーワードを絡めて説明してみましょう。
- C#アプリは、どのメソッドから実行されますか。また、そのようなメソッドのことをなんと呼ぶでしょうか。
- 文の末尾を示す記号を答えてください。
- C#で使えるコメントの記法をくべて挙げてください。また、これらのコメントの違いを説明してください。
- 2章
- 次の文章は、C#の基本構文について述べたものです。正しいものには◯、間違っているものには×を記入してください。
- ( )小数点型は、符号なし型と符合あり型とに分類できる。
- ( )文字列リテラルはダブルクオート、またはシングルクオートでくくる。
- ( )short型の型サフィックスは「〜s」である
- ( )暗黙的な型変換は常に安全なので、桁落ちなどの情報欠落は発生しない
- ( )メソッド/フィールドなどにアクセスするには、必ずnew演算子でクラスをインスタンス化しなければならない。
- 3章
- (省略)
- 4章
- (省略)
- 5章
- (省略)
- 6章
- この文章は、コレクションについて説明したものです。正しいものには◯、誤っているものには×を付けてください。
- ( )Listへの挿入/削除は、位置に関わらずほぼ一定のスピードで可能です。
- ( )LinkedListへの挿入/削除では要素前後のリンクの付け替えが発生するので、比較的低速である。
- ( )HashSetは要素の重複を許さず、一意の値を決められた順序で保持します。
- ( )Dictionaryは一意のキーと値のペアでデータを管理します。キーの並び順は保証されません。
- ( )Stackは先入れ先出し、Queueは後入れ先出しと呼ばれるデータ構造です。
- 7章
- 以下はオブジェクト指向の主要なキーワードについて説明したものです。正しいものには◯、誤っているものには×を付けてください。
- ( )フィールド/メソッドは外部から呼び出すことが前提の仕組みなので、アクセス修飾子も既定はpublicである。
- ( )readonlyフィールドとローカル変数の名前は重複してはならない
- ( )forループで宣言されたカウンター変数は登場以降、そのメソッドの内部であればアクセス可能である。
- ( )匿名型はその場限りであれば、引数や戻り値の型として利用することが可能である。
- 8章
- 以下の文章はオブジェクト指向構文について説明したものです。正しいものには◯、誤っているものには×を付けてください。
- ( )派生クラスから基底クラスのコンストラクターを呼び出すには、superキーワードを利用する。
- ( )virtual修飾子のないメソッドを、派生クラスで再定義することはできない。
- ( )override修飾子のないメソッドに、sealed修飾子を付けることはできない。
- ( )as演算子は左オペランドが右オペランドの方に変換できる場合にtrueを返す。
- ( )インターフェイスを複数実装することはできるが、クラスと一緒に実装/継承することはできない。
- 9章
- 以下の文章は本章で学んだ機能について説明したものです。正しいものには◯、誤っているものには×を付けてください。
- ( )catchブロックは、ブロックで指定された例外と発生した例外とが一致した場合にだけ実行される。
- ( )クラス/インターフェイス/構造体は、互いに入れ子の関係になることが可能である
- ( )構造体では、継承は可能だが、インターフェイスの実装はできない。
- ( )列挙定数の型は、任意の数値型から選択できる。
- ( )演算子のオーバーライドという機能を利用することで、「+」「-」「==」のような演算子をクラス独自に再定義できる。
- 10章
- 以下の文章は、デリゲート/ラムダ式/LINQについて述べたものです。正しいものには◯、誤っているものには×を付けてください。
- ( )引数にメソッドを引き渡すような用途では、ラムダ式よりも匿名メソッドを利用すべきである。
- ( )ラムダ式で引数がない場合には、「=>式」のように引数そのものを省略できる。
- ( )LINQのクエリ構文は、メソッド構文でできることであれば必ず表現できる。
- ( )LINQでは、与えられたデータソースによってプロバイダーを決定するので、アプリ開発者がプロバイダーを意識する必要はない。
- ( )LINQのクエリ構文は必ずselect句で終了しなければならない。
- 11章
- 以下の文章は本章で解説したテーマニついて説明したものです。正しいものには◯、誤っているものには×を付けてください。
- ( )スレッドを維持しておくのはリソースの浪費なので、できるだけその場その場で解放するのが望ましい。
- ( )await演算子は、指定された非同期処理の終了を待ってメインスレッドを待機させる。
- ( )属性によって適用できる要素は決まっている。
- ( )dynamic型では、存在しないメンバーを呼び出してもエラーにはならない。
- ( )イベントを登録するには、「=」演算子を利用する。
目次
意外とネットに転がってない…
- 1章 イントロダクション
- 1.1 C#の特徴
- 1.2 C#アプリを開発/実行するための基本環境
- 1.3 C#プログラミングの基本
- 2章 C#の基本
- 2.1 変数
- 2.2 データ型
- 2.3 リテラル
- 2.4 型変換
- 2.5 参照型
- 3章 演算子
- 3.1 算術演算子
- 3.2 代入演算子
- 3.3 関係演算子
- 3.4 論理演算子
- 3.5 ビット演算子
- 3.6 その他の演算子
- 3.7 演算子の優先順位と結合則
- 4章 制御構文
- 4.1 条件分岐
- 4.2 繰り返し処理
- 4.3 ループの制御
- 4.4 制御命令のその他の話題
- 5章 標準ライブラリ
- 5.1 文字列の操作
- 5.2 正規表現
- 5.3 日付/時刻
- 5.4 ファイル操作
- 5.5 その他の機能
- 6章 コレクション
- 6.1 コレクションAPIの基本
- 6.2 リスト
- 6.3 セット
- 6.4 ディクショナリ
- 7章 オブジェクト指向構文(基本)
- 7.1 クラス定義
- 7.2 フィールド
- 7.3 メソッド
- 7.4 コンストラクター
- 7.5 クラスメソッド/クラスフィールド
- 7.6 引数/戻り値のさまざまな記法
- 8章 オブジェクト指向構文(カプセル化/継承/ポリモーフィズム)
- 8.1 カプセル化
- 8.2 継承
- 8.3 ポリモーフィズム
- 9章 オブジェクト指向構文(名前空間/例外処理/ジェネリックなど)
- 9.1 名前空間
- 9.2 例外処理
- 9.3 列挙型
- 9.4 特殊なクラス(入れ子のクラス/パーシャルクラス)
- 9.5 ジェネリック
- 9.6 Objectクラス
- 9.7 演算子のオーバーロード
- 10章 ラムダ式/LINQ
- 10.1 デリゲート/匿名メソッド/ラムダ式
- 10.2 LINQ
- 11章 高度なプログラミング
- 11.1 マルチスレッド処理
- 11.2 属性
- 11.3 動的型付け変数(dynamic型)
- 11.4 イベント