C#言語の独学に最適な教科書
C#の文法・プログラムの書き方を、さまざまなサンプルプログラムを例示しながら詳細かつ丁寧に解説します。最新C# 7.1に対応しており、今から始める方にも、これまでの復習をしたい方にもお勧めです。解説→例題→理解度チェックの3ステップで、C#の文法をきちんと習得できます。
本書掲載のサンプルは、ダウンロード可能。どんどん動かして試してみてください。
更新履歴
- FAQ情報:2021年4月26日 更新
- 正誤訂正:2022年1月19日 更新
目次
- Chapter 1 イントロダクション
- 1.1 C#の特徴
- 1.1.1 オブジェクト指向
- 1.1.2 .NET環境
- 1.1.3 .NET Framework
- 1.2 C# アプリを開発/実行するための基本環境
- 1.2.1 Visual StudioとC#のバージョン
- 1.2.2 Visual Studioのインストール
- 1.3 C#プログラミングの基本
- 1.3.1 基本的なアプリの作成
- 1.3.2 ソースコードの全体像
- 1.3.3 デバッグの基本
- この章の理解度チェック
- Chapter 2 C#の基本
- 2.1 変数
- 2.1.1 変数の宣言
- 2.1.2 識別子の命名規則
- 2.1.3 より良い識別子のためのルール
- 2.1.4 定数
- 2.2 データ型
- 2.2.1 データ型の分類
- 2.2.2 整数型
- 2.2.3 浮動小数点型
- 2.2.4 文字型
- 2.2.5 真偽型
- 2.2.6 オブジェクト型
- 2.2.7 型推論
- 2.3 リテラル
- 2.3.1 整数リテラル
- 2.3.2 浮動小数点リテラル
- 2.3.3 [補足]数値リテラルにおける型サフィックス
- 2.3.4 文字リテラル
- 2.3.5 文字列リテラル
- 2.4 型変換
- 2.4.1 暗黙的な変換
- 2.4.2 明示的な変換(キャスト)
- 2.4.3 [補足]文字列⇔数値の変換
- 2.5 参照型
- 2.5.1 クラス型
- 2.5.2 null値
- 2.5.3 配列型
- この章の理解度チェック
- Chapter 3 演算子
- 3.1 算術演算子
- 3.1.1 非数値が混在する演算
- 3.1.2 連続した文字列結合に注意
- 3.1.3 インクリメント演算子/デクリメント演算子
- 3.1.4 除算とデータ型
- 3.1.5 浮動小数点数の演算には要注意
- 3.2 代入演算子
- 3.2.1 値型/参照型による代入
- 3.3 関係演算子
- 3.3.1 同一性と同値性
- 3.3.2 浮動小数点数の比較
- 3.3.3 配列の比較
- 3.3.4 条件演算子(?:)
- 3.3.5 null合体演算子
- 3.4 論理演算子
- 3.4.1 ショートカット演算(短絡演算)
- 3.5 ビット演算子
- 3.5.1 ビット論理演算子
- 3.5.2 ビットシフト演算子
- 3.6 その他の演算子
- 3.6.1 sizeof演算子
- 3.6.2 nameof演算子
- 3.7 演算子の優先順位と結合則
- 3.7.1 優先順位
- 3.7.2 結合則
- この章の理解度チェック
- Chapter 4 制御構文
- 4.1 条件分岐
- 4.1.1 if命令——単純分岐
- 4.1.2 if命令——多岐分岐
- 4.1.3 if命令——入れ子構造
- 4.1.4 [補足]中カッコは省略可能
- 4.1.5 switch命令
- 4.1.6 switch命令による型判定
- 4.2 繰り返し処理
- 4.2.1 while/do...while命令
- 4.2.2 [補足]無限ループ
- 4.2.3 for命令
- 4.2.4 foreach命令
- 4.3 ループの制御
- 4.3.1 break命令
- 4.3.2 continue命令
- 4.3.3 ループのネストとbreak/continue命令
- 4.4 制御命令のその他の話題
- 4.4.1 goto命令
- 4.4.2 プリプロセッサディレクティブ
- この章の理解度チェック
- Chapter 5 標準ライブラリ
- 5.1 文字列の操作
- 5.1.1 文字列の長さを取得する
- 5.1.2 文字列を大文字小文字、全角半角、ひらがなカタカナを区別せずに比較する
- 5.1.3 文字列がnull/空文字であるかを判定する
- 5.1.4 文字列を検索する
- 5.1.5 文字列に特定の文字列が含まれるかを判定する
- 5.1.6 部分文字列を取得する
- 5.1.7 文字列を特定の区切り文字で分割する
- 5.1.8 文字列を整形する
- 5.2 正規表現
- 5.2.1 正規表現の基本
- 5.2.2 文字列が正規表現パターンにマッチしたかを判定する
- 5.2.3 正規表現で文字列を検索する
- 5.2.4 正規表現で文字列をグローバル検索する
- 5.2.5 正規表現オプションでマッチング時の挙動を制御する
- 5.2.6 正規表現で文字列を置換する
- 5.2.7 正規表現で文字列を分割する
- 5.3 日付/時刻
- 5.3.1 日付/時刻オブジェクトを生成する
- 5.3.2 年月日、時分秒などの時刻要素を取得する
- 5.3.3 日付/時刻値を整形する
- 5.3.4 日付を加算/減算する
- 5.3.5 日付/時刻値の差分を取得する
- 5.3.6 日付/時刻を演算子で操作/比較する
- 5.4 ファイルの操作
- 5.4.1 テキストをファイルに書き込む
- 5.4.2 テキストファイルを読み込む
- 5.4.3 フォルダー/ファイルを操作する
- 5.5 その他の機能
- 5.5.1 数学演算——Mathクラス
- 5.5.2 long型以上の整数を演算する——BigInteger構造体
- 5.5.3 配列を操作する——Arrayクラス
- この章の理解度チェック
- Chapter 6 コレクション
- 6.1 コレクションAPIの基本
- 6.1.1 ジェネリック構文
- 6.1.2 基本的なコーディング手法
- 6.2 リスト
- 6.2.1 List(リスト)
- 6.2.2 LinkedList(二重リンクリスト)
- 6.2.3 Stack(スタック)
- 6.2.4 Queue(キュー)
- 6.3 セット
- 6.3.1 セットの基本操作
- 6.3.2 並び順を管理するSortedSetクラス
- 6.4 ディクショナリ
- 6.4.1 Dictionary(ディクショナリ)
- 6.4.2 SortedDictionary(ソート済みディクショナリ)
- 6.4.3 SortedList(二分探索)
- この章の理解度チェック
- Chapter 7 オブジェクト指向構文(基本)
- 7.1 クラスの定義
- 7.1.1 クラス名
- 7.1.2 修飾子
- 7.1.3 メンバーの記述順
- 7.2 フィールド
- 7.2.1 フィールド名
- 7.2.2 修飾子
- 7.2.3 既定値
- 7.3 メソッド
- 7.3.1 メソッド名
- 7.3.2 実引数と仮引数
- 7.3.3 戻り値
- 7.3.4 修飾子
- 7.3.5 thisキーワード
- 7.3.6 メソッドのオーバーロード
- 7.3.7 ローカル関数
- 7.3.8 変数のスコープ
- 7.4 コンストラクター
- 7.4.1 コンストラクターの基本
- 7.4.2 デフォルトコンストラクター
- 7.4.3 コンストラクターのオーバーロード
- 7.4.4 オブジェクト初期化子
- 7.4.5 デストラクター
- 7.5 クラスメソッド/クラスフィールド
- 7.5.1 クラスメソッド
- 7.5.2 クラスフィールド
- 7.5.3 [例]シングルトンパターン
- 7.5.4 クラス定数
- 7.5.5 静的コンストラクター
- 7.5.6 静的クラス
- 7.6 引数/戻り値のさまざまな記法
- 7.6.1 引数の既定値
- 7.6.2 名前付き引数
- 7.6.3 可変長引数のメソッド
- 7.6.4 値渡しと参照渡し
- 7.6.5 戻り値の参照渡し
- 7.6.6 出力引数(outキーワード)
- 7.6.7 タプル
- 7.6.8 匿名型
- 7.6.9 イテレーター
- この章の理解度チェック
- Chapter 8 オブジェクト指向構文(カプセル化/継承/ポリモーフィズム)
- 8.1 カプセル化
- 8.1.1 アクセス修飾子
- 8.1.2 フィールドのアクセス権限とプロパティ
- 8.1.3 インデクサー
- 8.2 継承
- 8.2.1 継承の基本
- 8.2.2 メソッドの隠蔽
- 8.2.3 メソッドのオーバーライド
- 8.2.4 コンストラクター(継承時の挙動)
- 8.2.5 継承の禁止
- 8.2.6 オーバーライドの禁止
- 8.2.7 参照型における変換
- 8.2.8 型の判定
- 8.2.9 拡張メソッド
- 8.3 ポリモーフィズム
- 8.3.1 ポリモーフィズムの例
- 8.3.2 抽象メソッド
- 8.3.3 インターフェイス
- 8.3.4 インターフェイスと抽象クラスとの使い分け
- この章の理解度チェック
- Chapter 9 オブジェクト指向構文(名前空間/例外処理/ジェネリックなど)
- 9.1 名前空間
- 9.1.1 名前空間の基本
- 9.1.2 名前の解決
- 9.1.3 エイリアス修飾子
- 9.1.4 グローバル名前空間エイリアス
- 9.1.5 名前解決の優先順位
- 9.1.6 [補足]using static命令による型のインポート
- 9.2 例外処理
- 9.2.1 例外処理の基本
- 9.2.2 finallyブロック
- 9.2.3 例外クラスの型
- 9.2.4 例外をスローする
- 9.2.5 例外をスローする場合の留意点
- 9.2.6 例外クラスを拡張する
- 9.2.7 オーバーフローのチェック
- 9.3 列挙型
- 9.3.1 列挙型の基本
- 9.3.2 列挙型のさまざまな宣言
- 9.3.3 列挙型の正体
- 9.3.4 列挙型によるビットフィールド表現
- 9.3.5 構造体
- 9.3.6 構造体の定義
- 9.3.7 コンストラクターの宣言
- 9.4 特殊なクラス(入れ子のクラス/パーシャルクラス)
- 9.4.1 入れ子のクラス
- 9.4.2 パーシャルクラス
- 9.4.3 パーシャルメソッド
- 9.5 ジェネリック
- 9.5.1 ジェネリック型の定義
- 9.5.2 ジェネリック型を宣言する場合の注意点
- 9.5.3 型パラメーターの制約条件
- 9.5.4 共変と反変
- 9.5.5 ジェネリックメソッド
- 9.6 Objectクラス
- 9.6.1 Objectクラスの主なメソッド
- 9.6.2 オブジェクトの文字列表現を取得する——ToStringメソッド
- 9.6.3 オブジェクト同士が等しいかを判定する——Equalsメソッド
- 9.6.4 オブジェクトのハッシュ値を取得する——GetHashCodeメソッド
- 9.6.5 ボクシングとアンボクシング
- 9.7 演算子のオーバーロード
- 9.7.1 オーバーロードの基本
- 9.7.2 さまざまなオーバーロードの例
- この章の理解度チェック
- Chapter 10 ラムダ式/LINQ
- 10.1 デリゲート/匿名メソッド/ラムダ式
- 10.1.1 デリゲートの基本
- 10.1.2 [例]メソッドの引数としてメソッドを引き渡す
- 10.1.3 マルチキャストデリゲート
- 10.1.4 匿名メソッド
- 10.1.5 ラムダ式
- 10.1.6 ラムダ式によるメンバーの定義
- 10.1.7 ラムダ式を伴うListクラスのメソッド
- 10.2 LINQ
- 10.2.1 本章で利用するサンプルデータ
- 10.2.2 クエリ構文とメソッド構文
- 10.2.3 データの検索条件を指定する——where句/Whereメソッド
- 10.2.4 データを並べ替える——orderby句/OrderByメソッド
- 10.2.5 特定のプロパティだけを取り出す——select句/Selectメソッド
- 10.2.6 データの重複を除去する——Distinctメソッド
- 10.2.7 m〜n件目のデータを取得する——Skip/Takeメソッド
- 10.2.8 先頭のデータを取得する——Firstメソッド
- 10.2.9 データをグループ化する——group句/GroupByメソッド
- 10.2.10 グループ化した結果を絞り込む——into句
- 10.2.11 複数のデータソースを結合する——join句/Joinメソッド
- この章の理解度チェック
- Chapter 11 高度なプログラミング
- 11.1 マルチスレッド処理
- 11.1.1 スレッドの生成/実行
- 11.1.2 タスクの生成/実行
- 11.1.3 排他制御
- 11.1.4 async修飾子とawait演算子
- 11.1.5 [例]値を返す非同期メソッド
- 11.1.6 非同期メソッドの利用例
- 11.2 属性
- 11.2.1 属性の記述位置
- 11.2.2 属性の構文
- 11.2.3 標準の属性
- 11.2.4 属性の自作
- 11.2.5 [補足]リフレクションの主なメソッド
- 11.3 動的型付け変数(dynamic型)
- 11.3.1 dynamic型の基本
- 11.3.2 動的型付け言語との連携
- 11.3.3 JSONデータの解析
- 11.3.4 動的オブジェクトの定義
- 11.4 イベント
- 11.4.1 イベントの基本
- 11.4.2 イベント/デリゲートの相違点
- この章の理解度チェック
- 付録A
- 「練習問題」「この章の理解度チェック」解答
- コラム
- Visual Studioで利用するC#のバージョンを変更する
- ブラウザー環境でC#のコードを実行する——C# Pad
- C#をより深く学ぶための関連書籍
正誤表
| 該当頁 | 該当箇所 | 修正刷 |
|---|---|---|
| 訂正箇所 | 訂正事項 | 更新日 |
| p.29 | 本文 7行目 | 2刷 |
| [2]を優先して利用することをお勧めします。 | [1]を優先して利用することをお勧めします。 | 2018/03/13 |
| p.42 | 表2.3 組み込み型 整数型(符号なし)の.NET型 3項目 | 2刷 |
| Unit16 Unit32 Unit64 |
UInt16 UInt32 UInt64 |
2017/12/13 |
| p.42 | 表2.3 floatの範囲 | 3刷 |
| -3.402823×1038 ~ 3.402823×1038 | -3.402823×10^38 ~ 3.402823×10^38 (38を上付き文字にしてください) |
2018/01/19 |
| p.42 | 表2.3 doubleの範囲 | 2刷 |
| -1.79769313486232×10308 ~1.79769313486232×10308 | -1.79769313486232×10^308 ~1.79769313486232×10^308 (308を上付き文字にしてください) |
2018/01/19 |
| p.58 | 図2.9 吹き出しの中 | 2刷 |
| = 128(10) | = 127(10) | 2018/01/22 |
| p.75 | ジャグ配列の場合のコード例末尾 (本文 12行目) | 2刷 |
| Console.Writeline(data.Length); | Console.Writeline(jagged.Length); | 2018/03/13 |
| p.75 | 本文 14行目 | 2刷 |
| 変数dataはint[]型の要素を3個持っています。 | 変数jaggedはint[]型の要素を3個持っています。 | 2018/03/13 |
| p.91 | 3.3.4 項 リスト3.9上の本文 | 2刷 |
| 変数scoreが70以上であれば「合格」 | 変数scoreが70以上であれば「合格!」 | 2018/03/23 |
| p.97 | 本文7行目 | 2刷 |
| つまり、ここでは「0111」(10進数では10) | つまり、ここでは「1010」(10進数では10) | 2018/03/23 |
| p.97 | 図3.11 10進数の値 | 2刷 |
| 5 | 10 | 2018/03/24 |
| p.109 | 図4.1 右側の図の1番下の矢印の中 | 5刷 |
| || | && | 2019/12/04 |
| p.156 | Noteの下10行目 | - |
| StringSplitOptions.RemoveEmptyEntities値 | StringSplitOptions.RemoveEmptyEntries値 | 2021/04/26 |
| p.157 | [構文]書式指定子 | 2刷 |
| {index, [,align] [:format[prec]] | {index [,align] [:format[prec]] | 2017/12/19 |
| p.162 | 本文 最終行 | 2刷 |
| 大文字/小文字を区別する方法については | 大文字/小文字を区別しない方法については | 2018/03/23 |
| p.178 | [2]指定された年月日、時分秒から生成する 本文 | 2刷 |
| 分であれば0~60です。 | 分であれば0~59です。 | 2018/03/23 |
| p.199 | リスト5.45 DirectoryProcess.cs 最終行 | 2刷 |
| dir2.Delete(ture); | dir2.Delete(true); | 2018/03/23 |
| p.226 | 表6.7 Queueクラスの主なメンバー | 2刷 |
| void Enqueue(T item) キュー先頭に要素itemを追加 T Dequeue() キューの末尾から要素を取得&削除 T Peek() キューの末尾から要素を取得(削除はしない) |
void Enqueue(T item) キューの末尾に要素itemを追加 T Dequeue() キューの先頭から要素を取得&削除 T Peek() キューの先頭から要素を取得(削除はしない) |
2018/03/13 |
| p.236 | 図6.12 子ノードの数値 | - |
| 17 | 21 | 2021/06/28 |
| p.260 | リスト7.8 String.cs | 2刷 |
| 補助線②が抜けている | 引数なしのToUpperメソッド(以下)が②に該当。 public String ToUpper() { ...中略... return this.ToUpper(CultureInfo.CurrentCulture); } |
2018/02/13 |
| p.290 | 本文 6行目 | 2刷 |
| 「こんばんは、山田太郎さん!」となります。 | 「はじめまして、山田太郎さん!」となります。 | 2018/03/23 |
| p.353 | リスト8.16 ConstArgs.cs 10行目 | 2刷 |
| class MConstArgs | class ConstArgs (Mを削除) |
2018/03/23 |
| p.365 | リスト8.24 ExtensionClient.cs | 2刷 |
| - | 1行目に補助線1を追加 | 2018/03/23 |
| p.430 | 本文 4行目 | 2刷 |
| 「フィールド'Coodinates.Latitude'は、 | 「フィールド'Coodinates.Longitude'は、 | 2018/03/23 |
| p.512 | 本文4行目 | - |
| ・b.Price / 1000 : 0~1000、1001~2000...の単位でグループ化 | ・b.Price / 1000 : 0~999、1000~1999...の単位でグループ化 | 2022/01/14 |
| p.514 | リスト10.40 クエリ構文 6行目 | - |
| orderby pubs.Key.ToString() | orderby pubs.Key.PublishYear, pubs.Key.PublishMonth | 2022/01/19 |
| p.514 | リスト10.40 メソッド構文 6行目 | - |
| .OrderBy(pubs => pubs.Key.ToString()); | .OrderBy(pubs => pubs.Key.PublishYear) .ThenBy(pubs => pubs.Key.PublishMonth); |
2022/01/19 |
| p.521 | 11.1.1項 本文5行目 | - |
| 0~50の範囲でカウントアップ | 0~49の範囲でカウントアップ | 2022/01/19 |
| p.527 | リスト11.3 下から6行目のコメント 本文5行目 | - |
| ThreadBadクラス | LockBasicBadクラス | 2022/01/19 |
| p.534 | [note]3行目 | - |
| Ellapsedプロパティ | Elapsedプロパティ | 2022/01/19 |
| p.547 | 本文1行目 | - |
| Version["1.0.0"] | Version("1.0.0") | 2022/01/19 |
| p.547 | 本文4行目 | - |
| VersionAttribute["1.0.0"] | VersionAttribute("1.0.0") | 2022/01/19 |
| p.567 | 本文 5行目(2か所) | 4刷 |
| EventClientクラス | EventBasicクラス | 2019/07/10 |
| p.572 | リスト11.B Practice2.cs 下から2行目 | 2刷 |
| return [ (6) ] Task.[ (7) ]() => { | return [ (6) ] Task.[ (7) ](() => { | 2018/04/21 |
| p.578 | この章の理解度チェック 問1の6 | 2刷 |
| & 、^ 、| 、>> 、<<から3個 | & 、^ 、| 、>> 、<<、~から3個 | 2018/03/23 |
| p.588 | この章の理解度チェック 問4の7 | 2刷 |
| base.GetValue() | {base.GetValue()} | 2018/03/23 |
FAQ
標準で提供されているライブラリのため、配布サンプルには同梱しておりません。
Stringクラス全体のソースについては、以下で公開されていますので、ご参照ください。
https://referencesource.microsoft.com/#mscorlib/system/string.cs
Stringクラス全体のソースについては、以下で公開されていますので、ご参照ください。
https://referencesource.microsoft.com/#mscorlib/system/string.cs
更新日: 2021.04.26
お問い合わせ
書籍に関するご質問や誤りのご報告、ご意見・ご感想などをお寄せください。
お問い合わせの前にFAQ・正誤表をご確認ください。すでに掲載済みの内容については個別回答が難しい場合があります。