C#言語の独学に最適な教科書
C#の文法・プログラムの書き方を、さまざまなサンプルプログラムを例示しながら詳細かつ丁寧に解説します。最新C# 10.0に対応しており、今から始める方にも、これまでの復習をしたい方にもお勧めです。解説→例題→理解度チェックの3ステップで、C#の文法をきちんと習得できます。
本書掲載のサンプルは、ダウンロード可能。どんどん動かして試してみてください。
更新履歴
- FAQ情報:2025年6月5日 更新
- 正誤訂正:2025年6月10日 更新
目次
- 第1章 イントロダクション
- 1.1 C# の特徴
- 1.1.1 オブジェクト指向
- 1.1.2 .NET 環境
- 1.1.3 .NET の内部構造
- 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 トップレベルステートメント [9.0]
- 1.3.4 デバッグの基本
- この章の理解度チェック
- 第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 null 許容参照型 [8.0]
- 2.5.4 配列型
- この章の理解度チェック
- 第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 結合則
- この章の理解度チェック
- 第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 命令による型判定 [7.0]
- 4.1.7 よりシンプルな多岐分岐を表現する - switch 式[8.0]
- 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 プリプロセッサディレクティブ
- この章の理解度チェック
- 第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.2.8 正規表現で文字列を置換する
- 5.2.9 正規表現で文字列を分割する
- 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 補足 using 命令のルールとさまざまな記法
- 5.4.3 テキストファイルを読み込む
- 5.4.4 フォルダー/ファイルを操作する
- 5.5 その他の機能
- 5.5.1 数学演算 ― Math クラス
- 5.5.2 乱数を生成する ― Random クラス
- 5.5.3 long 型以上の整数を演算する ― BigInteger 構造体
- 5.5.4 配列を操作する ― Array クラス
- 5.5.5 特定範囲のデータを編集する ― Span 構造体 [7.2]
- この章の理解度チェック
- 第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(二分探索)
- この章の理解度チェック
- 第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.0]
- 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.5.7 静的ローカル関数 [8.0]
- 7.6 引数/戻り値のさまざまな記法
- 7.6.1 引数の既定値
- 7.6.2 名前付き引数
- 7.6.3 可変長引数のメソッド
- 7.6.4 値渡しと参照渡し
- 7.6.5 戻り値の参照渡し [7.0]
- 7.6.6 出力引数(outキーワード)
- 7.6.7 タプル [7.0]
- 7.6.8 匿名型
- 7.6.9 イテレーター
- この章の理解度チェック
- 第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.0]
- 8.2.10 拡張メソッド
- 8.3 ポリモーフィズム
- 8.3.1 ポリモーフィズムの例
- 8.3.2 抽象メソッド
- 8.3.3 インターフェイス
- 8.3.4 インターフェイスと抽象クラスとの使い分け
- 8.3.5 インターフェイスのデフォルト実装 [8.0]
- この章の理解度チェック
- 第9章 オブジェクト指向構文(名前空間/例外処理/ジェネリックなど)
- 9.1 名前空間
- 9.1.1 名前空間の基本
- 9.1.2 名前の解決
- 9.1.3 エイリアス修飾子
- 9.1.4 グローバル名前空間エイリアス
- 9.1.5 名前解決の優先順位
- 9.1.6 補足 using static 命令による型のインポート
- 9.1.7 global using [10.0]
- 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.4 構造体
- 9.4.1 構造体の定義
- 9.4.2 コンストラクターの宣言
- 9.4.3 読み取り専用の構造体 [7.2]
- 9.4.4 読み取り専用の関数メンバー [8.0]
- 9.4.5 補足 ref 構造体 [7.2]
- 9.5 レコード型 [9.0]
- 9.5.1 レコード型の基本
- 9.5.2 with 式によるレコードの複製
- 9.5.3 レコード構造体 [10.0]
- 9.5.4 レコードの継承
- 9.6 特殊なクラス(入れ子のクラス/パーシャルクラス)
- 9.6.1 入れ子のクラス
- 9.6.2 パーシャルクラス
- 9.6.3 パーシャルメソッド
- 9.7 ジェネリック
- 9.7.1 ジェネリック型の定義
- 9.7.2 ジェネリック型を宣言する場合の注意点
- 9.7.3 型パラメーターの制約条件
- 9.7.4 共変と反変
- 9.7.5 ジェネリックメソッド
- 9.8 Objectクラス
- 9.8.1 Object クラスの主なメソッド
- 9.8.2 オブジェクトの文字列表現を取得する ― ToString メソッド
- 9.8.3 オブジェクト同士が等しいかを判定する ― Equals メソッド
- 9.8.4 オブジェクトのハッシュ値を取得する ― GetHashCode メソッド
- 9.8.5 オブジェクトを分解する ― Deconstruct メソッド
- 9.8.6 ボクシングとアンボクシング
- 9.9 演算子のオーバーロード
- 9.9.1 オーバーロードの基本
- 9.9.2 さまざまなオーバーロードの例
- この章の理解度チェック
- 第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 ラムダ式の拡張
- 10.1.8 ラムダ式によるメンバーの定義
- 10.1.9 ラムダ式を伴う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 メソッド
- この章の理解度チェック
- 第11章 高度なプログラミング
- 11.1 マルチスレッド処理
- 11.1.1 スレッドの生成/実行
- 11.1.2 タスクの生成/実行
- 11.1.3 排他制御
- 11.1.4 async 修飾子とawait 演算子
- 11.1.5 例 値を返す非同期メソッド
- 11.1.6 非同期メソッドの利用例
- 11.1.7 非同期ストリーム [8.0]
- 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 データの解析
- コラム
- プロジェクトで利用するC# のバージョンを変更する
- C# をより深く学ぶための関連書籍/記事
- 簡単なコードをその場で実行&確認する ― C# Interactive
正誤表
| 該当頁 | 該当箇所 | 修正刷 |
|---|---|---|
| 訂正箇所 | 訂正事項 | 更新日 |
| p.193 | 表5.15 変数$1に格納されている値 | - |
| (なし) | s | 2025/06/10 |
| p.216 | 図5.13 末尾の吹き出し | 3刷 |
| 終端ではEndOfStream プロパティがfalseを返す |
終端ではEndOfStream プロパティがtrueを返す |
2023/11/09 |
| p.229 | [構文]Spanコンストラクター 引数lengthの概要 | 3刷 |
| 生成するSpanに含める最後の要素 | 生成するSpanに含める要素数 | 2023/11/09 |
| p.327 | リスト 7.43 下の本文 | 4刷 |
| 仮引数dataが、2の実引数dataを参照する | 2の仮引数dataが、実引数dataを参照する | 2024/08/11 |
| p.487 | [note]3行目 | 2刷 |
| ただし、インターフェイスの配下で、他の型を入れ子にすることはできません。 | (左記を削除します。) | 2022/09/04 |
| p.611 | 本文下から2行目 | 2刷 |
| 引数strがnullでなければメソッド全体としてもnullであることを保証できれば便利です。 | 引数strがnullでなければメソッド全体としてもnullでないことを保証できれば便利です | 2022/10/27 |
| p.625 | リスト11.A hello.py | 4刷 |
| print "Hello, Python!" | print("Hello, Python!") | 2025/02/24 |
| p.659 | 「この章の理解度チエック P.529」1.の2番目 | 2刷 |
| (×) クラス/構造体は、~しかし、インターフェイスは他の型を入れ子にすることはできません。 |
(〇) 正しい記述です。 |
2022/09/04 |
FAQ
本書刊行後に既定のフォルダー名が「Visual C#」から「C#」に変更されたようです。以下のパスにSelfLearnCSharp.zipを配置してお試しください。
C:\Users\<ユーザー名>\Documents\Visual Studio 2022\Templates\ItemTemplates\C#
C:\Users\<ユーザー名>\Documents\Visual Studio 2022\Templates\ItemTemplates\C#
更新日: 2025.06.05
ダウンロード
お問い合わせ
書籍に関するご質問や誤りのご報告、ご意見・ご感想などをお寄せください。
お問い合わせの前にFAQ・正誤表をご確認ください。すでに掲載済みの内容については個別回答が難しい場合があります。