| | | 謝辞 | (17) |
| | |
はじめに
| (19) |
| |
第 1 部 Microsoft .NET Frameworkの基礎
|
| |
| |
第 1 章 .NET Frameworkのアーキテクチャ
|
3
|
| | | 1.1 | ソースコードをコンパイルしてマネージモジュールにする | 3 |
| | | 1.2 | マネージモジュールをアセンブリにまとめる | 7 |
| | | 1.3 | 共通言語ランタイムのロード | 9 |
| | | 1.4 | アセンブリのコードの実行 | 12 |
| | | 1.5 | ILとコードの検証 | 19 |
| | | 1.6 | .NET Frameworkクラスライブラリ | 21 |
| | | 1.7 | 共通型システム | 24 |
| | | 1.8 | 共通言語仕様(CLS) | 27 |
| | | 1.9 | アンマネージコードとの相互運用 | 31 |
| |
| |
第 2 章 アプリケーションと型のビルド、パッケージング、配布、管理
|
35
|
| | | 2.1 | .NET Frameworkの配布に関する目標 | 35 |
| | | 2.2 | 型をビルドしてモジュールを作成する | 37 |
| | | 2.3 | モジュールを結合してアセンブリを構成する | 46 |
| | | | 2.3.1 | Visual Studio .NETのIDEを使ってプロジェクトにアセンブリを追加する | 52 |
| | | | 2.3.2 | アセンブリリンカーの利用 | 54 |
| | | | 2.3.3 | アセンブリにリソースファイルを含める | 56 |
| | | 2.4 | アセンブリのバージョンリソース情報 | 56 |
| | | | 2.4.1 | バージョン番号 | 60 |
| | | 2.5 | カルチャ | 61 |
| | | 2.6 | シンプルなアプリケーション配布(プライベートアセンブリ) | 63 |
| | | 2.7 | シンプルな管理作業(構成) | 64 |
| |
| |
第 3 章 共有アセンブリ
|
69
|
| | |
3.1
|
2種類のアセンブリと2種類の配布
| 70 |
| | |
3.2
|
アセンブリに厳密名を付ける
| 71 |
| | |
3.3
|
グローバルアセンブリキャッシュ
| 76 |
| | | |
3.3.1
|
GACの内部構造
| 81 |
| | |
3.4
|
厳密名付きアセンブリを参照するアセンブリのビルド
| 84 |
| | |
3.5
|
厳密名付きアセンブリは改ざんできない
| 87 |
| | |
3.6
|
遅延署名
| 88 |
| | |
3.7
|
厳密名付きアセンブリをプライベートに配布する
| 92 |
| | |
3.8
|
サイドバイサイド実行
| 93 |
| | |
3.9
|
ランタイムによる型の参照の解決
| 95 |
| | |
3.10
|
高度な管理作業(構成)
| 98 |
| | | |
3.10.1
|
発行者ポリシー制御
| 102 |
| | |
3.11
|
欠陥アプリケーションの復元
| 104 |
| |
第 2 部 型の操作とCLR(共通言語ランタイム)
|
| |
| |
第 4 章 型の基礎
|
111
|
| | | 4.1 | すべての型はSystem.Objectから派生する | 111 |
| | | 4.2 | 別の型への変換(キャスト) | 113 |
| | | | 4.2.1 | C#のisおよびas演算子を利用したキャスト | 115 |
| | | 4.3 | 名前空間とアセンブリ | 118 |
| |
| |
第 5 章 単純型、参照型、値型
|
123
|
| | | 5.1 | プログラミング言語と単純型 | 123 |
| | | | 5.1.1 | 単純型の操作とChecked/Unchecked | 127 |
| | | 5.2 | 参照型と値型 | 130 |
| | | 5.3 | 値型のボックス化とボックス化解除 | 136 |
| |
| |
第 6 章 オブジェクトの共通操作
|
149
|
| | | 6.1 | オブジェクトの等値性とアイデンティティ | 149 |
| | | | 6.1.1 | ObjectのEqualsをオーバーライドしていない基底型から継承した参照型によるEqualsの実装 | 150 |
| | | | 6.1.2 | ObjectのEqualsをオーバーライドしている基底型から継承した参照型によるEqualsの実装 | 152 |
| | | | 6.1.3 | 値型によるEqualsの実装 | 154 |
| | | | 6.1.4 | Equalsおよび==演算子と!=演算子の実装のまとめ | 156 |
| | | | 6.1.5 | アイデンティティ | 157 |
| | | 6.2 | オブジェクトのハッシュコード | 158 |
| | | 6.3 | オブジェクトの複製 | 161 |
| |
第 3 部 型の設計
|
| |
| |
第 7 章 型のメンバとそのアクセス制御
|
167
|
| | | 7.1 | 型のメンバ | 167 |
| | | 7.2 | アクセス修飾子と定義済み属性 | 171 |
| | | | 7.2.1 | 型の定義済み属性 | 172 |
| | | | 7.2.2 | フィールドの定義済み属性 | 173 |
| | | | 7.2.3 | メソッドの定義済み属性 | 173 |
| |
| |
第 8 章 定数とフィールド
|
175
|
| | | 8.1 | 定数 | 175 |
| | | 8.2 | フィールド | 176 |
| |
| |
第 9 章 メソッド
|
179
|
| | | 9.1 | インスタンスコンストラクタ | 179 |
| | | 9.2 | タイプコンストラクタ | 186 |
| | | 9.3 | 演算子をオーバーロードするメソッド | 189 |
| | | | 9.3.1 | 演算子とプログラミング言語の相互運用性 | 192 |
| | | 9.4 | 型変換演算子メソッド | 195 |
| | | 9.5 | 引数をメソッドに参照で渡す | 199 |
| | | 9.6 | メソッドに可変個の引数を渡す | 204 |
| | | 9.7 | 仮想(virtual)メソッドの呼び出し | 207 |
| | | 9.8 | 仮想メソッドのバージョン管理 | 208 |
| |
| |
第 10 章 プロパティ
|
215
|
| | | 10.1 | 引数をとらないプロパティ | 215 |
| | | 10.2 | 引数をとるプロパティ | 220 |
| |
| |
第 11 章 イベント
|
227
|
| | | 11.1 | イベントを公開する型の設計 | 228 |
| | | 11.2 | イベント通知を受ける型の設計 | 233 |
| | | 11.3 | イベントへの登録の明示的な制御 | 236 |
| | | 11.4 | 多くのイベントを定義する型の設計 | 238 |
| | | 11.5 | EventHandlerSet型の設計 | 243 |
| |
第 4部 基礎となる型
|
| |
| |
第 12 章 文字の扱い
|
249
|
| | | 12.1 | 文字 | 249 |
| | | 12.2 | System.String型 | 253 |
| | | | 12.2.1 | 文字列の作成 | 253 |
| | | | 12.2.2 | 文字列は不変 | 255 |
| | | | 12.2.3 | 文字列の比較 | 256 |
| | | | 12.2.4 | 文字列のインターン | 261 |
| | | | 12.2.5 | 文字列のプーリング | 266 |
| | | | 12.2.6 | 文字列の中の文字の検証 | 266 |
| | | | 12.2.7 | そのほかの文字列操作 | 270 |
| | | 12.3 | 動的な文字列作成を効率よく行う | 270 |
| | | | 12.3.1 | StringBuilderオブジェクトの作成 | 271 |
| | | | 12.3.2 | StringBuilderのメンバ | 272 |
| | | 12.4 | オブジェクトの文字列表現を取得する | 275 |
| | | | 12.4.1 | 文字列の整形とカルチャ | 276 |
| | | | 12.4.2 | 複数のオブジェクトを書式指定して単一の文字列にする | 280 |
| | | | 12.4.3 | 独自のフォーマッタを提供する | 282 |
| | | 12.5 | 文字列をパースしてオブジェクトを取得する | 285 |
| | | 12.6 | エンコーディング:文字とバイトを相互変換する | 290 |
| | | | 12.6.1 | 文字のストリームをバイトにエンコードまたはデコードする | 297 |
| | | | 12.6.2 | 文字列のBase64エンコードとデコード | 298 |
| |
| |
第 13 章 列挙型とビットフラグ
|
301
|
| | | 13.1 | 列挙型 | 301 |
| | | 13.2 | ビットフラグ | 306 |
| |
| |
第 14 章 配列
|
311
|
| | | 14.1 | すべての配列は暗黙のうちにSystem.Arrayから派生する | 314 |
| | | | 14.1.1 | 配列のキャスト | 316 |
| | | 14.2 | 配列を引数や戻り値として利用する | 318 |
| | | 14.3 | 下限がゼロでない配列を作成する | 319 |
| | | 14.4 | 配列への高速アクセス | 320 |
| | | 14.5 | 配列の次元と上下限の変更 | 325 |
| |
| |
第 15 章 インターフェイス
|
327
|
| | | 15.1 | インターフェイスと継承 | 327 |
| | | 15.2 | プラグインコンポーネントをサポートするアプリケーションの設計 | 333 |
| | | 15.3 | ボックス化された値型のフィールドをインターフェイスを使って操作する | 335 |
| | | 15.4 | 同名のメソッドを持つ複数のインターフェイスを実装する | 338 |
| | | 15.5 | インターフェイスのメンバの明示的な実装 | 340 |
| |
| |
第 16 章 カスタム属性
|
347
|
| | | 16.1 | カスタム属性を利用する | 347 |
| | | 16.2 | 独自の属性を定義する | 351 |
| | | 16.3 | 属性のコンストラクタとフィールド/プロパティのデータ型 | 355 |
| | | 16.4 | カスタム属性の利用を検出する | 356 |
| | | 16.5 | 2つの属性のインスタンスを一致させる | 361 |
| | | 16.6 | 擬似カスタム属性 | 364 |
| |
| |
第 17 章 デリゲート
|
367
|
| | | 17.1 | デリゲートの紹介 | 367 |
| | | 17.2 | デリゲートを使ってstaticなコールバックメソッドを呼び出す | 370 |
| | | 17.3 | デリゲートを使ってインスタンスコールバックメソッドを呼び出す | 372 |
| | | 17.4 | デリゲートの謎を解く | 373 |
| | | 17.5 | デリゲートの歴史:System.DelegateとSystem.MulticastDelegate | 377 |
| | | 17.6 | デリゲートが等しいことを確認する | 379 |
| | | 17.7 | デリゲートのチェイン | 380 |
| | | 17.8 | デリゲートのチェインに対するC#のサポート | 385 |
| | | 17.9 | デリゲートチェインの起動を制御する | 385 |
| | | 17.10 | デリゲートとリフレクション | 388 |
| |
第 5 部 型の管理
|
| |
| |
第 18 章 例外処理
|
395
|
| | | 18.1 | 例外処理の進化 | 396 |
| | | 18.2 | 例外処理のメカニズム | 398 |
| | | | 18.2.1 | tryブロック | 399 |
| | | | 18.2.2 | catchブロック | 400 |
| | | | 18.2.3 | finallyブロック | 402 |
| | | 18.3 | 例外の厳密な定義 | 403 |
| | | 18.4 | System.Exceptionクラス | 407 |
| | | 18.5 | FCLに定義されている例外クラス | 408 |
| | | 18.6 | 独自の例外クラスの定義 | 411 |
| | | 18.7 | 例外の適切な使い方 | 416 |
| | | | 18.7.1 | 必ずfinallyブロックを利用する | 417 |
| | | | 18.7.2 | 何でもかんでも捕捉しない | 418 |
| | | | 18.7.3 | 例外から正しく復旧する | 420 |
| | | | 18.7.4 | 復旧不能な例外が起きたら処理途中のものはすべて取り消す | 420 |
| | | | 18.7.5 | 実装の詳細を隠蔽する | 422 |
| | | 18.8 | FCLの問題点 | 424 |
| | | 18.9 | パフォーマンスの考慮 | 427 |
| | | 18.10 | 例外フィルタ | 430 |
| | | 18.11 | 未処理の例外 | 432 |
| | | | 18.11.1 | 未処理の例外が発生したときのCLRの動作の制御 | 438 |
| | | | 18.11.2 | Windowsフォームと未処理の例外 | 439 |
| | | | 18.11.3 | ASP.NETのWebフォームと未処理の例外 | 441 |
| | | | 18.11.4 | ASP.NETのXML Webサービスと未処理の例外 | 441 |
| | | 18.12 | 例外のスタックトレース | 442 |
| | | | 18.12.1 | スタックトレースのリモーティング | 444 |
| | | 18.13 | 例外のデバッグ | 445 |
| | | | 18.13.1 | Visual Studio .NETでデバッグするコードの種類の設定 | 449 |
| |
| |
第 19 章 自動メモリ管理(ガベージコレクション)
|
453
|
| | | 19.1 | ガベージコレクションプラットフォームの基礎知識 | 453 |
| | | 19.2 | ガベージコレクションのアルゴリズム | 457 |
| | | 19.3 | ファイナライゼーション | 461 |
| | | | 19.3.1 | Finalizeメソッドが呼び出されるトリガ | 468 |
| | | | 19.3.2 | ファイナライゼーションの詳細 | 470 |
| | | 19.4 | Disposeパターン:オブジェクトのクリーンアップを強制する | 474 |
| | | | 19.4.1 | Disposeパターンを実装する型の利用 | 480 |
| | | | 19.4.2 | C#のusingステートメント | 484 |
| | | | 19.4.3 | 依存関係からくる興味深い問題 | 486 |
| | | 19.5 | 弱い参照 | 487 |
| | | | 19.5.1 | 弱い参照の詳細 | 489 |
| | | 19.6 | 復活 | 491 |
| | | | 19.6.1 | 復活を使ってオブジェクトプールを設計する | 493 |
| | | 19.7 | ジェネレーション | 496 |
| | | 19.8 | プログラムによるガベージコレクタの制御 | 502 |
| | | 19.9 | そのほかのガベージコレクタのパフォーマンス上の考慮点 | 505 |
| | | | 19.9.1 | 同期不要のメモリ確保 | 506 |
| | | | 19.9.2 | スケーラブルな並列ガベージコレクション | 507 |
| | | | 19.9.3 | ガベージコレクションの同時実行 | 507 |
| | | | 19.9.4 | 大きなオブジェクト | 509 |
| | | 19.10 | ガベージコレクションの監視 | 509 |
| |
| |
第 20 章 CLRのホスティング、AppDomain、リフレクション
|
511
|
| | | 20.1 | メタデータ:.NET Frameworkの基礎 | 511 |
| | | 20.2 | CLRホスティング | 512 |
| | | 20.3 | AppDomain | 514 |
| | | | 20.3.1 | AppDomain境界を越えてオブジェクトにアクセスする | 517 |
| | | | 20.3.2 | AppDomainのイベント | 519 |
| | | | 20.3.3 | CLRとAppDomainをホスティングするアプリケーションとその方法 | 520 |
| | | | 20.3.4 | 「Yukon」 | 522 |
| | | 20.4 | リフレクションの基本 | 522 |
| | | 20.5 | アセンブリに含まれる型をリフレクションで取得する | 524 |
| | | 20.6 | AppDomainのアセンブリをリフレクションで取得する | 527 |
| | | 20.7 | 型のメンバをリフレクションで取得する:バインディング | 528 |
| | | 20.8 | アセンブリを明示的にロードする | 529 |
| | | | 20.8.1 | アセンブリを「データファイル」としてロードする | 532 |
| | | 20.9 | Exceptionから派生した型の階層構造を表示する | 533 |
| | | 20.10 | アセンブリを明示的にアンロードする:AppDomainのアンロード | 536 |
| | | 20.11 | System.Typeオブジェクトへの参照を取得する | 538 |
| | | 20.12 | 型のメンバに対してリフレクションを実行する | 542 |
| | | | 20.12.1 | 型のインスタンスの作成 | 545 |
| | | | 20.12.2 | 型のメソッドを呼び出す | 547 |
| | | | 20.12.3 | 1度のバインドで何度も起動する | 551 |
| | | 20.13 | 型が実装するインターフェイスをリフレクションで取得する | 557 |
| | | 20.14 | リフレクションのパフォーマンス | 559 |
| |
| | | 索引 | 561 |
| | | 著者紹介 | 595 |