10日でおぼえるC♯入門教室(arton)|翔泳社の本
  1. ホーム >
  2. 書籍 >
  3. 10日でおぼえるC♯入門教室

10日でおぼえるC♯入門教室


形式:
書籍
発売日:
ISBN:
9784798128566
定価:
3,080(本体2,800円+税10%)
仕様:
B5変・448ページ
カテゴリ:
プログラミング・開発
キーワード:
#プログラミング,#開発環境,#開発手法,#Web・アプリ開発
シリーズ:
10日でおぼえる
紙の書籍

C#を基礎からしっかり学べる1冊

本書はC#を基本から学びたい人のための入門書です。サンプルを実際に作りながら学べるので、自分のペースできちんとC#を身に付けることができます。演算子やラムダ式から始まり、Windows 8タブレットアプリの開発手法までフォロー。C#初心者はもちろん、再学習をしたい人にもおすすめの1冊です。

CHAPTER01 開発環境の準備と操作ガイド

LESSON01 Visual Studioをインストールしよう
LESSON02 プロジェクトを作ろう
LESSON03 プログラムを実行しよう

 

CHAPTER02 対話型プログラムでC#の基本をマスターしよう

LESSON04 現在時刻を表示しよう
LESSON05 カウンターを作ろう
LESSON06 足し算をしよう
LESSON07 例外を捕まえよう
LESSON08 いろいろな計算しよう

CHAPTER03 電卓プログラムでオブジェクト指向とラムダ式をマスターしよう

LESSON09 クラスを作ろう
LESSON10 継承を使おう
LESSON11 ラムダ式を使って計算しよう
LESSON12 プッシュボタン式電卓を作ろう

CHAPTER04 情報収集プログラムでデータの取得と分類をマスターしよう

LESSON13 HTMLソースを表示しよう
LESSON14 HTMLからリンクを抽出しよう
LESSON15 データの管理方法をマスターしよう
LESSON16 コレクションからデータを抽出しよう

CHAPTER05 テキストエディターでファイルの読み書きをマスターしよう

LESSON17 テキストを保存しよう
LESSON18 テキストを読み込もう
LESSON19 複数の文字コードに対応しよう
LESSON20 安全にファイルを保存しよう

CHAPTER06 射的ゲームでオブジェクトの継承をマスターしよう

LESSON21 Formの上にオブジェクトを描画しよう
LESSON22 いろいろな的を作ろう
LESSON23 弾を飛ばそう
LESSON24 当たり判定を実装しよう

 

CHAPTER07 サウンドプレイヤーでデータの利用と同期を学ぼう

LESSON25 Waveファイルの内容を調べよう
LESSON26 逆再生Waveファイルを作ろう
LESSON27 非同期再生をしよう
LESSON28 音声合成をしよう

 

CHAPTER08 ソースコード閲覧プログラムで制御構造を学ぼう

LESSON29 ソースファイルのコメントと文字列を色づけしよう
LESSON30 行番号を表示しよう
LESSON31 状態をオブジェクトに変えよう
LESSON32 ソースコードをコンパイルしよう

 

CHAPTER09 リモコンプログラムで単体テストを利用した本格的なプログラミングを学ぼう

LESSON33 Webサーバを内臓したプログラムを作ろう
LESSON34 サーバ機能を切り離そう
LESSON35 HTML表示用リモコンを作ろう
LESSON36 ジュークボックスを作ろう

 

CHAPTER10 パラパラマンガでWindowsストアアプリのプログラミングを学ぼう

LESSON37 アプリケーションの枠組みを作ろう
LESSON38 お絵かきアプリケーションを作ろう
LESSON39 サスペンドから復帰できるようにしよう
LESSON40 パラパラマンガを完成させよう

付属データはこちら

お問い合わせ

内容についてのお問い合わせは、正誤表、追加情報をご確認後に、お送りいただくようお願いいたします。

正誤表、追加情報に掲載されていない書籍内容へのお問い合わせや
その他書籍に関するお問い合わせは、書籍のお問い合わせフォームからお送りください。

利用許諾に関するお問い合わせ

本書の書影(表紙画像)をご利用になりたい場合は書影許諾申請フォームから申請をお願いいたします。
書影(表紙画像)以外のご利用については、こちらからお問い合わせください。

  • Lesson13~Lesson16のサンプルについて(2022年10月)

     本書の執筆時点から約10年が経過し、インターネットを取り巻く状況がいろいろ変化しました。このためLesson13~Lesson16にはサンプルに利用しているCodeZineのWebサイトを始め時代にそぐわない面があります。特にLesson14~16についてはCodeZine.jpのHTMLの記述が変わったためそのままでは動作しません。このテキストではサンプルプログラムの修正方法について説明します。

    ●はじめに

     現在のWebサイトの標準プロトコルは執筆時点のHTTPからHTTPSに変わりました。
     本書のサンプルでは、CodeZineのURIとしてhttp://codezine.jpを利用しています。このままでも動作しますが、一般的にhttp:ではなくhttps:を利用すべきです。添付のzipファイルでは、https://codezine.jpを利用しています。
     簡単に説明すると、httpと異なりhttpsは、ブラウザー配布者が信頼性があると判断した認証局を利用して、接続先のホストが指定したホストであることを確認します。また、メッセージを暗号化することによってホストとクライアント間のメッセージを経由地点の他ホストによって改ざんされないことが保証されます。
     また、HTMLの記述方法はクラスを指定してスタイルを変更することで構成することが多くなっています。本書ではHTMLの解析に.NET FrameworkのRegexクラスを利用していますが、現在の標準的なHTMLを解析するにはHTMLパーサー(Html Agility Pack https://html-agility-pack.net/ など)を利用してHTML要素のクラス属性を元に解析したほうが簡単です。

    ●Lesson13

    Lesson13についてはそのままでも動作しますが、最初に述べたように、http://codezine.jpをhttps://codezine.jpに置換したほうが良いでしょう。

    ●Lesson14~16の修正について

    以下、そのままでは動作しないLesson14~16のサンプルの修正箇所について説明します。
    なお、以前の「追加情報」で説明したCodeZineのアクセスにUser Agentの設定が必須だった状態は現在は解消されています。しかし、本サンプルは以前の「追加情報」の追加修正としてあるため、User Agentの設定を含みます。

    ●Lesson14

    2022年10月現在、書籍執筆時にCodeZineのトップページにあったC#記事一覧へのリンクがなくなりました。
    このため、元のサンプルプログラムのGetCsharpUriメソッド(本書P.145 リスト3)そのものが動作しません。
    このレッスンの目的は読み込んだHTMLからリンクを抜き出すことが主眼なので、単純にトップページにある各記事へのリンクを抽出するように修正します。
    具体的には本書P.147 リスト5を以下のように変更して、GetCsharpUriメソッドを呼ばずに直接トップページから記事へのリンクを抽出します。



    private void button1_Click(object sender, EventArgs e)
    {
    using (var client = new WebClient())
    {
    // 次の行は現在では不要
    client.Headers.Add(HttpRequestHeader.UserAgent, "MyUserAgent");
    // http:ではなくhttps:を指定しましょう
    var uri = "https://codezine.jp";
    // 直接トップページからリンクを抽出します
    webBrowser1.DocumentText = CreateIndex(ReadPage(client, uri));
    }
    }



    ●Lesson15

    本レッスンの主眼はHTMLから抽出した情報をオブジェクトとしてコレクションで管理することです。コレクションとしてListとDictionaryを使います。
    特にDictionaryの動作のために、複数の異なるカテゴリ―毎にListを別管理します。
    以下では、CodeZineのトップページの利用ではなく、プログラミング記事一覧ページからJavaScriptなどを抽出します。
    なお、サンプルで抽出対象としているVB.NETの記事は減っているので、VB.NETをPythonに置き換えるほうが抽出対象が増えて良いかもしれません。
    以下の修正例は、「追加情報」の「Lesson15-16-new.zip」を元にして、本書の「著者名」の代わりに「日付」を使うようにしています。

    本書P.155 リスト3
    CodeZineTopの下にCodeZineProgrammingTopの定義を追加します。(CodeZineTopは利用しないため、置き換えても構いません)



    const string CodeZineProgrammingTop = "https://codezine.jp/programming/";



    本書 P.157 リスト7

    84行目のRegexのコンストラクタを以下に変えます。
    抽出対象のA要素を囲むP要素のクラス名などを指定し、日付はtime要素となっているなど、大きく異なります。HTMLの変更に合わせて正規表現のマッチ箇所が変わったため、続くArticleクラスのコンストラクタへのマッチオブジェクトのインデックスも変わります。



    var regex = new Regex(@"<p\s+class=""c-articleindex_item_heading""><a\s+href=""(/article/detail/[^""]+)"">([^<]+)</a></p>\s+(<p\s+class=""c-articleindex_item_description"">\s*([^<]+)\s*</p>)?.+?<time\s+datetime=""([^""]+)""", RegexOptions.Singleline);
    try
    {
    foreach (Match match in regex.Matches(html))
    {
    list.Add(new Article
    {
    Uri = match.Groups[1].Value,
    Title = match.Groups[2].Value,
    Date = match.Groups[5].Value,
    Summary = match.Groups[4].Value
    });
    }
    }



    本書 P.157 リスト5ではLesson14同様に読み込み対象をトップページからプログラミング記事一覧に変更します。
    また、該当プログラミング言語の記事が存在しない場合に空のリストを設定する処理を追加します。



    // プログラミング記事一覧からリンクを抽出
    var toppage = ReadPage(client, CodeZineProgrammingTop);
    foreach (var language in languages)
    {
    var uri = GetLanguageUri(toppage, language);
    // languageで指定したプログラミング言語記事がなければ空リストを設定
    if (string.IsNullOrEmpty(uri))
    {
    articles[language] = new List<Article>();
    }
    else
    {
    articles[language] = CollectArticles(ReadPage(client, uri));
    }
    }



    抽出対象を著者名から日付に変えたため、本書 P.159 の図2の(3)は記事の公開日付となります。

    ●Lesson16

    本レッスンの主眼はLesson15で作成したコレクションをLINQでアクセスすることにあります。
    このため、データ抽出箇所はLesson15と同じです。したがって、修正箇所はLesson15と同じとなります。


  • CodeZineのHTMLの変更などにより、Lesson13から16のサンプルが動作しなくなった件への対応(2015年9月)

    ★サンプルの更新
    CodeZineのHTMLの変更などに合わせて、Lesson13から16のサンプルが動作しなくなった件への更新情報です。

    ●Lesson13-16.zipについて

    [ Lesson13-16.zipのダウンロード]

    ○Lesson13

    第1刷
    ----------------------------------------------------
    ・CodeZineのサーバーアプリケーションの変更により、HTTPクライアントからのリクエストにユーザーエージェント
     (Webブラウザーの種類を示す情報)が無い場合、応答が返りません。
     Lesson13-16.zipのように、WebClientオブジェクトの生成後、ユーザーエージェントを指定してください。
     なお、指定する文字列には特に決まりはないため、このサンプルではMyUserAgentを指定しています。

    ▲Form1.cs:25行目を追加。HttpRequestHeader(HTTPリクエストヘダー)のUserAgentに、MyUserAgentを追加


    24: var client = new WebClient();
    25: client.Headers.Add(HttpRequestHeader.UserAgent, "MyUserAgent");
    26: try



    第2刷
    ----------------------------------------------------
    ・上記の点について、本文中では修正してありますが、他のLesson14以降およびサンプルはそのままとなっているため、
     同様に修正が必要です。

    ○Lesson14

    第1刷、第2刷
    ----------------------------------------------------
    Lesson13同様、ユーザーエージェントの設定が必要です。

    ▲Form1.cs:84行目を追加


    82: using (var client = new WebClient())
    83: {
    84: client.Headers.Add(HttpRequestHeader.UserAgent, "MyUserAgent");
    85: var uri = GetCsharpUri(ReadPage(client, "http://codezine.jp/"));



    また、CodeZienのHTMLの記述方法が変わったため、そのままではリンクの抽出ができません。55行目の正規表現を以下の
    ように修正してください。

    ▲Form1.cs:55行目を修正


    55: var regex = new Regex(@"([^<]+))");



    この正規表現では、/article/detail/で始まるURIを抽出するように変えています。

    ○Lesson15

    第1刷、第2刷
    ----------------------------------------------------
    Lesson13同様、ユーザーエージェントの設定が必要です。

    ▲Form1.cs 108行目を追加


    106: using (var client = new WebClient())
    107: {
    108: client.Headers.Add(HttpRequestHeader.UserAgent, "MyUserAgent");
    109: var toppage = ReadPage(client, CodeZineTop);



    また、Lesson14と同様にHTMLの記述方法の変更に伴う修正が必要です。
    また著者の表示がなくなったことに対応する必要もあります。
    以下のように正規表現を修正することで、URI、タイトル、サマリーの抽出が可能となります。

    ▲Form1.cs 83行目を修正


    83: var regex = new Regex(@"([^<]+)[^p]+p>¥s*([^<]+)



    上記の修正により正規表現のグループ番号がずれることと、著者名が取得できなくなったことから、88行目以降を次のように
    修正します。


    88: list.Add(new Article
    89: {
    100: Uri = match.Groups[1].Value,
    101: Title = match.Groups[2].Value,
    102: Author = String.Empty,
    103: Summary = match.Groups[3].Value
    104: });



    102行目では、著者名として空文字列(StringクラスのEmptyプロパティを利用します)を設定しています。

    ○Lesson16

    第1刷、第2刷
    ----------------------------------------------------
    Lesson13~15と同様に修正が必要です。

    ▲Form1.cs:97行目の正規表現を修正。106行目、著者名にString.Emptyを設定。107行目グループ番号を3にする。


    97: var regex = new Regex(@"([^<]+)[^p]+p>¥s*([^<]+) 98: try
    99: {
    100: foreach (Match match in regex.Matches(html))
    101: {
    102: list.Add(new Article
    103: {
    104: Uri = match.Groups[1].Value,
    105: Title = match.Groups[2].Value,
    106: Author = String.Empty,
    107: Summary = match.Groups[3].Value
    108: });
    109: }
    110: }



    ▲Form1.cs 145行目を追加


    143: using (var client = new WebClient())
    144: {
    145: client.Headers.Add(HttpRequestHeader.UserAgent, "MyUserAgent");
    146: var toppage = ReadPage(client, CodeZineTop);



    ●Lesson15-16-new.zipについて

    [Lesson15-16-new.zipのダウンロード]

    Lesson13-16.zipの修正では、著者名に空文字列を設定することでとりあえず動作するようにしています。
    しかし、それではLesson16のListBoxの選択変更によって表示を変更する処理の動作を見ることができません。
    この修正では、Authorプロパティの代わりにDateプロパティを使うように修正してあります。
    これによって、Lesson16ではリストボックスに表示された日付を選択して記事を変更することができます。
    それ以外の点、ユーザーエージェントの設定などはLesson13-16.zipと同様なため、詳細については説明を割愛します。
  • Lesson14~16のサンプルエラーについて(2013年7月)

    chapter4「情報収集プログラムでデータの取得と分類をマスターしよう」のLesson14~16で扱うサンプルについて
    本書掲載内容のままプログラムを記述すると、高い可能性でCodeZineからエラーが返されることが判明いたしました。

    CodeZineのサイトがWebリクエストに含まれるUser Agent(ブラウザの種類を示す文字列)情報を確認しているため、
    本書のサンプルのようにUserAgentを含まない要求を拒否するようです。
    また、複数のリクエストを連続的に実行した場合も高頻度でエラーとなります。
    このため、本文のリストを以下のように修正し、ダミーのUser Agentの設定と、各リクエストの間に待ち時間を
    入れるようにしてください。
    具体的なコードの修正は下記の通りです。

    P.144 リスト2
    24行目と25行目の間に、User Agentを設定するコードを挿入します。
    client.Headers.Add(HttpRequestHeader.UserAgent, "MyUserAgent");

    上記のコードで、ClientオブジェクトのHeadersコレクション(Webリクエストのヘッダ情報)に、UserAgent文字列を
    設定します。

    P.155 リスト3
    47行目と48行目の間に、User Agentを設定するコードを挿入します。
    client.Headers.Add(HttpRequestHeader.UserAgent, "MyUserAgent");

    P.158 リスト5
    110行目と111行目の間(上記の47、48行目の間に1行挿入しているため、実際は111行目と112行目の間となります)で、
    System.Threading.ThreadクラスのSleepメソッドを呼び出して、実行を一時停止します。
    ThreadクラスのSleepメソッドはstaticメソッドで、パラメータで指定したミリ秒間、呼び出したスレッドの実行を
    スリープ(停止)させます。

    この箇所に挿入することで、各言語ページのリクエストを送信する前に必ず指定した時間の待機時間を設定します。
    ここでは300を指定して、300ミリ秒を待機時間に設定しています*1。
    System.Threading.Thread.Sleep(300);

    なお、ここでは行番号のずれを最小にするために、System.Threading.Threadと表記しています。
    System.Threadingの部分はソースの先頭で、他のネームスペースと一緒にusingしても構いません。

    P.169 リスト3
    61行目と62行目の間に、User Agentを設定するコードを挿入します。
    client.Headers.Add(HttpRequestHeader.UserAgent, "MyUserAgent");
    P.171 リスト5
    147行目と148行目の間(実際は上記の61行目と62行目の間に1行挿入しているため、148行目と149行目の間となります)
    System.Threading.Thread.Sleep(300);

    *1Webアクセスを行うプログラムでは、サイトに連続してリクエストを送信して過剰な負荷をかけないように
    プログラミングするのが鉄則です。
    本書のサンプルではリクエスト数が限定されていることから、この処理を怠っていました。
    このため、読者の皆様にご迷惑をおかけしたことをお詫びします。

ご購入いただいた書籍の種類を選択してください。

書籍の刷数を選択してください。

刷数は奥付(書籍の最終ページ)に記載されています。

現在表示されている正誤表の対象書籍

書籍の種類:

書籍の刷数:

本書に誤りまたは不十分な記述がありました。下記のとおり訂正し、お詫び申し上げます。

対象の書籍は正誤表がありません。

最終更新日:2015年07月30日
発生刷 ページ数 書籍改訂刷 電子書籍訂正 内容 登録日
1刷
練習問題Q9Testプロジェクト
Q9Testプロジェクト-UnitTest1.cs内のTestCallAsyncメソッド、およびTestCallSyncメソッドを複数回テスト実行すると失敗することが判明しました。
下記より修正を施したUnitテストのファイルをダウンロードのうえ、差替えをお願いします。 http://www.shoeisha.com/book/hp/10days/down/index.html#9784798128566
2013.07.04
1刷 053
側注*4の3行目
2刷
-演算子をデクリメント演算子と呼びます。
--演算子をデクリメント演算子と呼びます。
2013.04.03
1刷 053
「数値のカウントアップ」8行目
2刷
C#には同様に1減少させる-演算子が用意されています。
C#には同様に1減少させる--演算子が用意されています。

53ページで「-演算子」となっている箇所はすべて「--演算子」です。
2013.02.19
1刷 076
表1 演算子
2刷
& 論理積 左項と右項の論理和を求める | 論理和 左項と右項の論理積を求める
& 論理積 左項と右項の論理積を求める | 論理和 左項と右項の論理和を求める
2013.04.08
1刷 096
側注*1の6行目
2刷
overrite(上書き)
overwrite(上書き)
2015.07.30
1刷 127
側注*4の5行目
2刷
IActionButtonを
IButtonActionを
2015.07.29
1刷 135
リスト2の24行目の次にコード1行とその注釈を追加
2刷
var client = new WebClient(); try
var client = new WebClient(); client.Headers.Add(HttpRequestHeader.UserAgent, "MyUserAgent"); ―Webサーバーがブラウザーの種類を判断できるように、UserAgentプロパティを設定する
try

これに伴い、p.136 リスト3の25行目も上記の追加した1行となります。
2015.07.29
1刷 144
リスト2 24行目と25行目の間
2刷
{
try
{
client.Headers.Add(HttpRequestHeader.UserAgent, "MyUserAgent");
try
2013.07.08
1刷 146
61行目
2刷
builder.Append(match.Groups[1].Value);
builder.Append(match.Groups[2].Value);
2015.07.30
1刷 155
リスト3 47行目と48行目
2刷
{
try
{
client.Headers.Add(HttpRequestHeader.UserAgent, "MyUserAgent");
try
2013.07.08
1刷 158
リスト5 110行目と111行目の間
2刷
{
var uri = GetLanguageUri(toppage, language);
{
System.Threading.Thread.Sleep(300);
var uri = GetLanguageUri(toppage, language);
2013.07.08
1刷 169
リスト3 61行目と62行目の間
2刷
{
try
{
client.Headers.Add(HttpRequestHeader.UserAgent, "MyUserAgent");
try
2013.07.08
1刷 171
リスト5 147行目と148行目
2刷
{
var uri = GetLanguageUri(toppage, language);
{
System.Threading.Thread.Sleep(300);
var uri = GetLanguageUri(toppage, language);
2013.07.08
1刷 198
2つめのコードブロックの1行目
2刷
var toal = 0;
var total = 0;
2015.07.30
1刷 258
096行目
2刷
AvarageBytesPerSecond
AverageBytesPerSecond
2015.07.30
1刷 259
122行目
2刷
AvarageBytesPerSecond
AverageBytesPerSecond
2015.07.30
1刷 260
155行目
2刷
AvarageBytesPerSecond
AverageBytesPerSecond
2015.07.30
1刷 269
コード223行目
2刷
AvarageBytesPerSecond
AverageBytesPerSecond
2015.07.30
1刷 289
49行目、51行目、58行目(3か所)
2刷
AvarageBytesPerSecond
AverageBytesPerSecond
2015.07.30
1刷 290
116行目
2刷
AvarageBytesPerSecond
AverageBytesPerSecond
2015.07.30
1刷 397
38行目、47行目(2か所)
2刷
AddMediaOpend
AddMediaOpened
2015.07.30
1刷 399
90行目、93行目(2か所)
2刷
MediaOpend
MediaOpened
2015.07.30
1刷 399
91行目
2刷
AddMediaOpend
AddMediaOpened
2015.07.30
1刷 400
111行目のコードと注釈
2刷
MediaOpend
MediaOpened
2015.07.30
1刷 419
手順8の1行目
2刷
エディターからデザイナーへ戻って
続けて
2013.02.05
1刷 442
リスト8への補足説明
2刷
「from the text 'マウス」という文言が含まれたStandardStyles.xamlのエラーが表示される場合は、1767行目にある「マウス」を半角の「Mouse」に置き換えてください。
2015.07.30

感想・レビュー

ryo511 さん

2015-04-15

C#とWindowsフォームを同時進行で学習していくようになっているが、1冊目にはおすすめできない。最初はC#の言語仕様を詳しく解説してある本を読んだほうが、理解がしやすいと思う。操作手順を詳しく解説しているので、C#がある程度分かってる人であれば、本書でスムーズにWindowsフォームを学べる。A-