Head First C#
――頭とからだで覚えるC#の基本

[cover photo]
  • 2008年10月 発行
  • 592ページ
  • ISBN978-4-87311-383-8
  • フォーマット Print PDF
  • 原書: Head First C#

この商品は好評につき現在入荷待ちです
Ebook Storeで電子版を購入:
価格3,629円

楽しいイラスト満載、親しみやすい語り口でわかりやすいと大人気のHead Firstシリーズに新たにC#バージョンが登場!プログラミングの基本知識と実際の実装方法を詳しく解説します。プログラミングがまったく初めてという読者でも大丈夫。挫折することなく簡単にC#アプリケーションの構築ができます。C#初心者向け、ビジュアル重視の楽しい入門書です。C# 3.0対応。


推薦のことば

新しい世界への足がかり

 C#との付き合いは、2002年の春からだから、もうそろそろ足かけ6年になる。C#と出会う前には、1997年から、Javaの国際標準化に関わっていた。これは、1970年代のCコンパイラの開発と1980年代のLispの国際標準化とを掛け合わせたようなもので、様々な人たちと一緒に仕事できて楽しかった。Javaの国際標準化がSun Microsystems社の内部事情から御破算になって、C#の国際標準化に携わったのは、私にとっては、失地回復の意味合いもあった。

 この6年ほどで、C#も変わってきたけれども、C#を取り巻く環境は、もっと大きく変わってしまった。文部科学省の科学技術政策研究所では、情報技術の一般化と基盤化が話題になった。コンピュータの専門家と言われる人たちの存在意義がなくなると同時に、誰もがコンピュータの基本原理、プログラムやシステムの基本についての知識を要求されるようになっている。

 これは、あまり声高に論じられていないことだけれども、社会生活を支える重要な業務を遂行支援するコンピュータ・システムを作るためのプログラミング言語として、C#は、今や一つの典型的な例となっている。言い換えると、C#の基本的な機能を理解して使いこなせることができれば、現在のコンピュータ・システムの仕掛けが分かるようになるはずだ。

 今回、ヘッドファーストという、イラスト満載のとっつきやすい入門書がC#について作られ、それが日本語になって出版されたのは、こういったことから喜ばしい。本の厚さの関係で、すべてが訳されていないのは残念だが、何もすべてを一度に学ぶ必要もないだろう。そうは言っても総称(generics)の辺りは、学んでおいて欲しいなあ(編注:本書では総称(generics)については触れられていませんが、弊社刊行の『C#クックブック第3版』の「2章 ジェネリック」ならびに『プログラミングC#第4版』の「9章 配列、インデクサ、コレクション」で詳しく解説していますので、そちらをご参照ください)。

 現在の大学を含めた学校制度や、企業、社会の制度がこのまま続くとは思えない。すでに、いろいろとほころびも出始めているし、世界のあちこちを見れば、変革の兆しがある。

 若い人たちは、新しい事柄を、新しい流儀で学び、それを自分の世界で使っていくべきだ。この本は、そのような新しい旅でのいいきっかけを与えてくれることだろう。その旅の先には、思いがけない出会いも、きっとあるに違いない。

JIS C#原案作成委員会委員長
文部科学省科学技術動向センター客員研究員
CSKフェロー
黒川 利明


推薦のことば

ドキドキ、ワクワクするプログラミングを

 この10年インターネットとパソコンの普及で身のまわりのいたるところに計算機が存在し、誰もが計算機を使えるようになってきた。ほとんどの利用者は計算機を単に使うだけである。それはそれで素晴らしいことなのだが、当り前のようにあるので計算機に対する夢は一見すると減ってきたような感がある。しかし、その中でも計算機に興味を持ち、自分でも「プログラムを書いてみたい」と言う人は年齢性別を問わず、確かにいるし、そのような興味が新しいソフトウェアを生み出す原動力になっている。

 ところが、どうもプログラミングは初学者にとって難しく思われてしまう。プログラミング言語が持っている計算モデル、文法よりも、そもそも、どのように考えればプログラムを作れるか、でつまずくのは今も昔も変わりはないように思われる。皮肉なことに、現在の計算機はGUI、ネットワークなどバッチジョブのFortranの時代よりも複雑な資源を扱っており、ますます難しい印象を与えているようである。また、さまざまな分野でオブジェクト指向なるものが使われているので、最初に触れる人にとって複雑さは増しているらしい。

 大学の教員としてだけでなく、企業に在籍したことも、初等中等教育にも関係したが、プログラミングを学ぶときに、堅苦しい例題や一般論だけで効果があった例を見たことがない。プログラミングやプログラミング言語の良著の多くは、その言語のエッセンスについて楽しい例題と豊富な事例により、その言語の醍醐味を余すことなく伝えてきた。本書は、豊富なイラストと事例、ユーモアあふれる内容で、初学者にとってとっつきにくいオブジェクト指向などの話題をやさしく、わかりやすく伝えている。C#と言う現代、さらには将来性の高いプログラミング言語を実践的な方法で解説している良著である。

 C#自身は現代的な洗練されたプログラミング言語である。言語として、新しい挑戦的な機能を含むだけでなく、CLIなどのプログラム実行環境も極めて興味深いものを持っている。ただ、新しい言語ゆえに各種著書が待たれる状況であろう。「C#って面白そうだよね、だけど、何か良くわからなくて...」と言う向きも少なからずいると思われる。まず、本著でC#を味わってみていただきたい。そして、事例や例題を通じて、ソフトウェアをわかる、作れるドキドキ、ワクワク感を体験していただければと思う。その先には、プログラミングのさらに奥深い世界と、次の時代が待っているのである。

東京農工大学 大学院共生科学技術研究院 教授
並木 美太郎

序章
    本書の対象読者
    みなさんが思っていることはわかっています
    メタ認知:自分の思考について考える
    脳を服従させるために「みなさん」ができること
    注意事項
    テクニカルレビューアチーム
    謝辞

1章 C#で生産性を高める:10分でできるビジュアルアプリケーション
    なぜC#を学ぶべきなのか
    C#とVisual Studio IDEにより多くのことが簡単になる
    CEOによるペーパーレス化を手伝う
    プログラムの構築を始める前にユーザのニーズを知る
    構築しようとしているもの
    Visual Studioで行うこと……
    Visual Studioが行ってくれること……
    ユーザインタフェースを開発する
    Visual Studioの舞台裏
    自動生成コードに追加する
    早くもアプリケーションを実行できる
    情報を格納するデータベースが必要
    連絡先用のテーブルの作成
    連絡先カードの記入箇所はPeopleテーブルの列である
    テーブルの構築を完了する
    アプリケーションがアクセスできるようにデータを
    ダイアグラム化する
    データベースにカードデータを挿入する
    データソースを使ってフォームとデータベースオブジェクトを
    接続する
    フォームにデータベース駆動型コントロールを追加する
    優れたプログラムは使いやすい
    あなたのアプリケーションをみんなのアプリケーションに
    する方法
    ユーザにアプリケーションを提供する
    まだ終わりではない:インストールのテストを行う
    完全なデータ駆動型アプリケーションを構築

2章 あくまでコードである:内部では
    以下のことを行っているときには……
    ……IDEは以下のことを実行する
    プログラムはどこから生まれるのか
    IDEがコーディングを助ける
    IDEで何かを変更すると、コードも変更することになる
    プログラムの構造
    プログラムは開始場所を知っている
    プログラムのエントリポイントを変更できる
    同じ名前空間に2つのクラスが存在できる
    プログラムは変数を使ってデータを扱う
    C#はなじみのある算術記号を使う
    ループは処理を繰り返し実行する
    コーディングを始めよう
    if / else文は判断を下す
    条件を設定して真かどうかを確認する

3章 オブジェクト指向になる!:わかりやすいコードにする
    マイクは問題をどのように考えているか
    マイクのカーナビは問題をどのように考えているか
    マイクのNavigatorクラスは道順の設定と修正を行う
    メソッドを持つ
    これまでに学習した成果を生かして簡単なアプリケーションを
    構築する
    マイクがひらめく
    マイクはオブジェクトを使って問題を解決できる
    クラスを使ってオブジェクトを生成する
    クラスから新しいオブジェクトを生成すると、その
    オブジェクトはそのクラスのインスタンスと呼ばれる。
    より優れた解決策は……オブジェクトによって
    もたらされる!
    インスタンスはフィールドを使って状態を管理する
    インスタンスを生成しましょう!
    メモリに感謝
    プログラム内の様子
    クラス名とメソッド名を使ってコードを直感的に
    わかりやすくする
    クラスを自然な構造にする
    クラス図はクラスの意味がわかりやすく体系化できる
    男たちを扱うクラスを構築する
    男たちのためのプロジェクトを作成する
    お金をやり取りするフォームを構築する
    もっと簡単なオブジェクトの初期化方法がある
    直感的にわかりやすいクラスを設計するための考え方

4章 型と参照:10時です。データがどこにあるかわかりますか?
    変数の型で格納できるデータの種類が決まる
    変数はデータの持ち帰り用カップのようなもの
    5ポンドのバッグに10ポンドのデータ
    数値のサイズが正しくても、任意の変数に代入できる
    わけではない
    大きすぎる値をキャストすると、C#は自動的に調整する
    C#が自動的に行うキャストもある
    メソッドを呼び出すときには、変数がパラメータの型と
    一致する必要がある
    =と演算子を結合する
    オブジェクトでも変数を使う
    参照変数を使ってオブジェクトを参照する
    参照はオブジェクト用のラベルのようなものである
    参照がなくなったら、オブジェクトはガーベージコレクション
    の対象となる
    複数の参照とその副作用
    2つの参照があると2つの方法でオブジェクトのデータを
    変更できる
    特別な場合:配列
    配列は多くの参照変数も格納できる
    ものぐさジョーの貧乏サイドイッチハウスへ
    ようこそ!
    オブジェクトは参照を使って会話する
    オブジェクトが未知の状態

5章 継承:オブジェクトの系図
    キャサリンは誕生会も扱う
    BirthdayPartyクラスが必要
    もう1つ……12人を超えるパーティに10000円の手数料を
    追加できる?
    クラスで継承を使うと、コードを一度記述するだけでよい
    クラスモデルの作成は、汎用的なものから始めて
    特定化する
    どのように動物園シミュレータを設計するか?
    継承を使ってサブクラス内のコードの重複を防ぐ
    動物によって鳴き声が違う
    動物をグループ化する方法を考える
    クラス階層を作成する
    すべてのサブクラスはベースクラスを拡張する
    ベースクラスから継承するにはコロンを使う
    継承はベースクラスのフィールド、プロパティ、メソッドを
    サブクラスに追加することがわかった……
    サブクラスはメソッドを上書きして、継承した
    メソッドの変更や置き換えができる
    ベースクラスを使えるところなら、代わりにその
    サブクラスを使える
    サブクラスはbaseキーワードを使ってベースクラスに
    アクセスできる
    ベースクラスにコンストラクタがある場合、サブクラスにも
    必要です
    キャサリンのための作業を完成させる準備ができた!
    蜜蜂の巣管理システムを構築する
    まず基本システムを構築する
    継承を使って蜂管理システムを拡張する

6章 インタフェースと抽象クラス:クラスに約束を守らせる
    蜜蜂の基本に戻りましょう
    継承を使ってさまざまな種類の蜂のクラスを作成できる
    インタフェースはクラスに特定のメソッドとプロパティを
    必ず実装するように指示する
    インタフェースの定義にはinterfaceキーワードを使う
    これで両方の仕事をするNectarStingerのインスタンスを生成できる
    インタフェースを実装するクラスはインタフェースのすべての
    メソッドを含む必要がある
    インタフェースを使ったちょっとした練習をする
    インタフェースをインスタンス化することはできないが、
    インタフェースを参照することはできる
    インターフェイス参照はオブジェクト参照と同様に機能する
    「is」を使うとクラスがあるインタフェースを実装しているか
    どうかがわかる
    インタフェースは他のインタフェースを継承できる
    RoboBee 4000は貴重な蜂蜜を使わずに働き蜂の仕事ができる
    isはオブジェクトが何を実装しているかがわかり、asは
    コンパイラにオブジェクトの扱い方を通知する
    CoffeeMakerもApplianceである
    アップキャストはオブジェクトとインタフェースのどちらでも
    機能する
    ダウンキャストは電気機器をコーヒーメーカに戻す
    アップキャストとダウンキャストはインタフェースでも使える
    パブリックとプライベートだけではない
    アクセス修飾子はスコープを変える
    決してインスタンス化すべきでないクラスもある
    抽象クラスはクラスとインタフェースの中間のようなものである
    以前にも言ったように、決してインスタンス化すべきでない
    クラスもある
    抽象メソッドは本体を持たない
    多相性とはあるオブジェクトが多くの異なる形態を取れること

7章 ファイルの読み書き:バイト配列を保存し、世界を救う
    C#はストリームを使ってデータの読み書きを行う
    異なるストリームは異なるものを読み書きする
    FileStreamはファイルにバイトを書き出す
    読み取りと書き込みには2つのオブジェクトを使う
    データは複数のストリームを通過できる
    組み込みオブジェクトで標準のダイアログボックスを
    ポップアップする
    ダイアログボックスもオブジェクトである
    組み込みのFileクラスとDirectoryクラスでファイルと
    ディレクトリを扱う
    ファイルダイアログでファイルのオープンと保存を行う
    IDisposableでオブジェクトを適切に破棄する
    using文でファイルシステムエラーを防ぐ
    ファイルの書き込みには多くの判断が必要
    switch文で適切な選択肢を選ぶ
    ファイルからトランプを読み込むオーバーロードされた
    Deck()コンストラクタを追加する
    オブジェクトを直列化するとどうなる?
    しかし、オブジェクトの状態とは正確には何か?
    何を保存する必要があるのか?
    オブジェクトを直列化するときには、そのオブジェクトが
    参照するすべてのオブジェクトも直列化される……
    直列化するとオブジェクト全体を一度に読み書きできる
    クラスを直列化したいなら、[Serializable]属性を付ける
    .NETは自動的にテキストをユニコードに変換する
    C#はバイト配列を使ってデータ内を移動する
    BinaryWriterを使ってバイナリデータを書き出す
    直列化されたファイルは手動でも読み書きできる
    StreamReaderとStreamWriterで十分

8章 例外処理:消火は時代遅れ
    ブライアンは口実プログラムを持ち運びたい
    プログラムが例外を発行するときには、.NETは
    Exceptionオブジェクトを生成する
    ブライアンのコードが思いがけない動作をした
    すべての例外オブジェクトはExceptionを継承する
    デバッガはコード内の例外の特定と回避に役立つ
    IDEのデバッガで問題点を正確に割り出す
    まずい、コードにはまだ問題がある……
    tryとcatchを使って例外を処理する
    呼び出したいメソッドが危険を伴うとき
    デバッガを使ってtry/catchフローを追跡する
    必ず実行すべきコードがある場合にはfinallyブロックを
    使う
    Exceptionオブジェクトで問題に関する情報を得る
    複数のcatchブロックで複数の種類の例外に対処する
    あるクラスが例外を発行し、別のクラスがその例外を捕捉
    する
    蜜蜂はOutOfHoney例外が必要
    多くの問題を回避する簡単な方法:usingは自動的にtryと
    finallyを提供する
    例外の回避:IDisposableを実装して独自の措置を講じる
    史上最悪のcatchブロック:コメント
    一時的な解決策でも(一時的には)問題ない
    例外処理に対する簡単な考え方
    ブライアンはやっと休暇が取れた……

9章 イベントとデリゲート:見ていないときのコードの動作
    オブジェクトが考えてくれればいいのに
    しかし、オブジェクトはどう対応すればいい?
    イベントが発生すると……オブジェクトは検知する
    あるオブジェクトがイベントを発行し、他のオブジェクトが
    それを検知する……
    そして、他のオブジェクトがイベントに対処する
    点を結ぶ
    IDEがイベントハンドラを自動的に作成してくれる
    フォームはすべてイベントを使う
    イベント送信者とイベント受信者を接続する
    デリゲートは実際のメソッドの代役を務める
    デリゲートを使う
    あらゆるオブジェクトがパブリックイベントを登録できる……

    イベントの代わりにコールバックを使い、デリゲートに
    1つだけのオブジェクトを関連付ける
    コールバックではデリゲートは使うけれどもイベントは
    使わない

10章 コントロールとグラフィックス:見栄えをよくする
    プログラムとのやり取りにはずっとコントロールを使って
    きた
    フォームコントロールは単なるオブジェクトである
    アーキテクチャにレンダラを追加する
    コントロールは可視表示要素に適している
    最初のアニメーションコントロールを作成する
    UserControlはコントロールを作成する簡単な方法
    プロジェクトに蜂の巣と野原のフォームを追加する
    レンダラの構築
    プログラムで無理をしていた
    Graphicsオブジェクトを使ってBitmapのサイズを変更した
    画像リソースはBitmapオブジェクトに格納される
    System.Drawingを使って自分で画像を制御する
    GDI+グラフィックスの30秒ツアー
    グラフィックスを使ってフォームに画像を描画する
    グラフィックスは透明問題を解決できる……
    Paintイベントを使ってグラフィックスを存続させる
    フォームとコントロールを再描画する様子を詳しく見る
    ダブルバッファリングでアニメーションがかなりスムーズに
    見えるようになる
    ダブルバッファリングはフォームやコントロールに
    組み込まれている
    Graphicsオブジェクトとイベントハンドラを使って印刷
    PrintDocumentは印刷ダイアログオブジェクトと印刷プレビュー
    ウィンドウオブジェクトと連携して機能する

11章 LINQ:データの管理
    簡単なプロジェクト……
    ……しかし、データがあちこちにある
    LINQは複数のソースからデータを引き出せる
    .NETのコレクションはあらかじめLINQ用に
    設定されている
    LINQはクエリを簡単にする
    LINQは簡単だが、クエリは簡単である必要はない
    LINQは用途が広い
    LINQは結果をグループにまとめることができる
    ジミーの価格をグループにまとめる
    結合を使って2 つのコレクションを1 つのクエリに
    まとめる
    ジミーは多額のお金を節約した
    LINQをSQLデータベースに接続する
    結合クエリを使ってスターバズとObjectvilleを結合する

付録i 残りの事項:この本に含めたかった上位9 件のことがら
    (1) カプセル化.private宣言によりプライベートを守る
    (2) 列挙と集積データ.多くのデータの格納
    (3) 復習と予習.知識、力、そしてかっこいいモノの構築
    (4) お悩み隊長.オブジェクトの死
    (5) LINQからXMLへ
    (6) リファクタ
    (7) お気に入りのツールボックスコンポーネントをいくつか
    (8) コンソールアプリケーション
    (9) Windowsプレゼンテーションフレームワーク

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

1刷正誤表

Head First C# 第1刷正誤表

2009年2月9日更新

位置
p22
右側の図
Peaple People
p69
右上の
コメント
この行はsomeValueが3未満であるかを調べ、 この行はsomeValueが3と等しいかを調べ、
p173
2番目の
箇条書き
最終行
5のディスカウント 5のディスカウント
p202
②
②サブクラスを追加してみますが、コンストラクタは呼び出しません。 次に、このサブクラスをインスタンス化してメッセージボックスを表示するボタンをフォームに追加します。
public class MySubclass : MyBaseClass
{
    public MySubclass(string baseClassNeedsThis,
                      int anotherValue) 
    {
       MessageBox.Show("これはサブクラス" + baseClassNeedsThis
           + "で値は" + anotherValue + "です。");
    }
}
②カメレオンは舌でえさを捕まえて食べます。そこで、ChameleonクラスはAnimalクラスを継承しますが、Eat()メソッドを上書きします。
public class Chameleon : Animal {
   public override void Eat(Food morsel) {
      CatchWithTongue(morsel);
      Swallow(morsel);
      Digest();
   }
}
p208
コードの
下から
5行目
return totalCost * 95M; return totalCost * .95M;
p264
後半の
コード
public class OutsideWithDoor : Outside, IHasExteriorDoor
{
    public OutsideWithDoor(string name, bool hot, 
        string doorDescription)
        : base(name, hot)
    {
        this.doorDescription = doorDescription;
    }

    private string doorDescription;
    public string DoorDescription
    {
        get { return doorDescription; }
    }

    private Location doorLocation;
    public Location DoorLocation
    {
        get { return doorLocation; }
        set { doorLocation = value; }
    }
}

public class RoomWithDoor : Room, IHasExteriorDoor
{
    public RoomWithDoor(string name, string decoration, 
        string doorDescription)
        : base(name, decoration)
    {
        this.doorDescription = doorDescription;
    }

    private string doorDescription;
    public string DoorDescription
    {
        get { return doorDescription; }
    }

    private Location doorLocation;
    public Location DoorLocation
    {
        get { return doorLocation; }
        set { doorLocation = value; }
    }
}

※OutsideWithDoorクラスの定義を削除し、RoomWithDoorで置き換える。


p398
コードの
下から
5行目
return "サーディンの缶詰" + amount.ToString() + "缶 -- もっと必要です!" return "まだ必要だけど、とりあえずサーディンの缶詰" + amount.ToString() + "缶";

Feedback

皆さんのご意見をお聞かせください。ご購入いただいた書籍やオライリー・ジャパンへのご感想やご意見、ご提案などをお聞かせください。より良い書籍づくりやサービス改良のための参考にさせていただきます。
[feedbackページへ]