書評:C#ポケットリファレンス

http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=masaru.b.cl-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4774149489

 

#WINGSプロジェクト代表の山田祥寛さんから献本いただきました。ありがとうございました。

技術評論社さんの「ポケットリファレンス」シリーズといえば、これまでも数々の言語、環境、ライブラリなどで出版されていますが、ついに我らが「C#」も出ました。

 

全体的な話

リファレンスとして、C#の範疇だけではなく、ファイルIO、Webアクセス、データベースアクセスまでカバーしてあり、非常に素晴らしいと思いました。この辺りは、入門書では載っていないか、載っていてもほんのさわり程度しか紹介されていないことが多いので、やろうと思うとWeb検索くらいしかないのですよね。(そしてMSDNライブラリの海に沈んだりする・・・)

あと、500ページを超える本の割に薄く、それでいてページがめくりやすいので、脇に置いておくにはちょうど良いと思います。索引も充実していますし。

 

少し残念な話

そんな素晴らしいこの本ですが、残念ながら私が認識する限り、間違い、もしくはふさわしくないと思う部分がちらほら見受けられました。

 

p.100 匿名メソッドを定義する

従来デリゲートに登録するメソッドは、独立したメソッドとして定義する必要がありましたが、C# 3.0(.NET Framework 3.5)からは匿名メソッドを利用することができるようになりました。

匿名メソッドはC# 2.0で初登場し、当時「C#でクロージャが書けるようになった!」と話題になりました。その辺はこのあたりの記事に詳しいです。→第5回 匿名メソッドとデリゲート - @IT

匿名メソッド – MSDNライブラリ

C# 2.0 より前のバージョンでは、デリゲートを宣言するには名前付きメソッドを使用するしかありませんでした。 C# 2.0 では匿名メソッドが導入され、C# 3.0 以降では、インライン コードを記述するための本来の方法として、匿名メソッドに代わってラムダ式が使用されるようになりました。

 

p.101 ラムダ式を利用する

サンプルコードが間違っています。

delegate int SampleDelegate3(int x);
//delegate int DelegateLambda(int x); // (1)
class DelegateLambda
{
  static void Main(string[] args)
  {
    //DelegateLambda d = n => -n;
    SampleDelegate3 d = n => -n;  // (2)
    Console.WriteLine(d(3));

    // …
  }
}

(1)デリゲートの名前を変えるか、(2)定義したデリゲートの名前に合わせるかが必要です。

ただ、クラス名も「DelegateLambda」なので、たぶん(2)でしょう。

 

p.102 共変性/半変性の型パラメータを利用する

コード内のコメントが間違っています。

delegate void Action1<in T>(T obj);
interface ISample<out T> { };
class DelegateVar
{
  class Base { }
  class Sub : Base { };
  class Im : ISample<Sub> { };

  static void Main(string[] args)
  {
    Action1<object> d1 = n => { };
    Action1<string> d2 = d1;
    // d3 = d4; … (1)

    // …
  }
}

(1)d1 = d2;の間違いかと思われます。

 

p.103 イベントを宣言する

イベントの説明のはずですが、イベントをただのデリゲートとして扱うサンプルコードになっています。

Observerパターンをデリゲートを用いて実装したものがイベントなので、イベントハンドラの登録、登録解除を行うようなサンプルだったらよかったと思いました。

 

ちなみに、私が作成したイベントのサンプルはこちらです→デザインパターンを学ぶ~その5:Ovserverパターン(2)~

 

p.104,106 例外に関する記述

Exception未指定のcatch、throw;を用いた例外再スロー、集約例外ハンドラの紹介がなく、残念でした。例外は基本的に「キャッチしたら必要なロールバック処理をして再スロー、集約例外ハンドラでログ出力などのエラー処理」とするものだと思うので。

 

こんな感じで。

var transaction = ….;
try
{
  // …
  transaction.Commit();
}
catch
{
  transaction.RollBack();
  throw;  // (1)
}
finally
{
  transaction.Dispose();
}

(1)キャッチした例外を再スローし、上位の処理に任せる(大抵は集約例外ハンドラ)。

集約例外ハンドラーも含めた例外処理のパターンは、こちらの記事がとても参考になります。→.NETの例外処理 Part.1 – とあるコンサルタントのつぶやき – Site Home – MSDN Blogs

 

p.107 usingを用いてリソースを破棄する

主題がusingにあるのに、サンプルコードにtry-catchも書いてあり、しかもex.MessageをConsole.WriteLineしているだけという状態です。このtry-catchは不要だったんじゃないかなぁと思います。

//try
//{
  using (StreamReader sr
    = new StreamReader("ExceptionUsing.cs", System.Text.Encoding.Default))
  {
    string text = sr.ReadToEnd();
    Console.Write(text);
  }
//}
//catch (Exception e)
//{
//  Console.WriteLine(e.Message);
//}

 

p.277 ファイル/ディレクトリ一覧を高速に列挙する

Directory.EnumerateXXXメソッド系の戻り値について次のように”コレクションとして~”と記載されていますが、正しくは「列挙可能な型であるIEnumerable<T>として~」です。

DirectoryクラスのEnumerateFiles/EnumerateDirectories/EnumerateFileSystemEntriesメソッドは、対象のディレクトリのファイル、ディレクトリ、ファイルとディレクトリの一覧を文字列のコレクションとして返します。

DirectoryInfoクラスのEnumerateFiles/EnumerateDirectories/EnumerateFileSystemInfosメソッドは、対象のディレクトリのファイル、ディレクトリ、ファイルとディレクトリの一覧をFileInfo/DirectoryInfo/FileSystemInfoのコレクションとして返します。

「コレクション」というと、本書p.202「コレクション共通のインタフェース(ICollection)」で説明している、以下のようなものを指すので、厳密に言えば全く違うものです。

ICollectionインタフェースでは、コレクションに共通な、要素を追加/削除するためのメソッド、プロパティが定義されています。

ただ「IEnumerable<T>をどう日本語で表すか」というのは難しいので、仕方がない面もあることは理解しています。

(

そういえば、本書にはIEnumerable<T>インタフェースの説明がありませんでした。ちゃんと説明しようと思うと深いところに入っていっちゃいそうなので、これも仕方ないですかね。)

 

まとめ

ちょっとした誤りはあるものの、全体としては素晴らしい本ですので、みんな買えばいいと思います!

広告

書評:C#ポケットリファレンス」への3件のフィードバック

  1. 土井

    高野様

    初めまして、WINGSプロジェクトの土井と申します。
    この度は拙著C#ポケットリファレンスの書評ありがとうございました。

    書評の中で、私が担当した章に含まれます「p.277 ファイル/ディレクトリ一覧を高速に列挙する」についてのご指摘がありました。
    ご指摘いただいたとおり、これらはコレクションではなくIEnumerableを返すメソッドでした。
    執筆者の意図としては、結果を一度に配列として返すのではなく、逐次結果を取り出すことのできるメソッド、というニュアンスで「コレクション」(≠ICollection)という語を用いておりました。

    今回ご指摘をいただいた後、表現の変更も検討したのですが、(こちらもご指摘の通り)ページ数の関係で書籍自体にIEnumerable自体の解説まで含めていないため、混乱を避けるため、ひとまず現状のままの表現とさせていただきます。
    やや厳密さに欠ける記述ではありますが、書式の部分を見ることで正確な型も理解できますので、大まかな目的は果たせるかと考えております。

    今回はリファレンス本での解説の表現について考えさせられる機会でした。
    ご指摘に重ねて感謝申し上げます。

    返信
    1. takanosho 投稿作成者

      土井様

      ご丁寧な回答、ありがとうございました。
      IEnumerableの動作は一言では説明が難しいものですので、致し方ないと私も思います。

      土井様の今後の活躍も期待しています。

      #@ITのEntity Framework入門、大変参考にさせていただいています。

      返信
  2. 高江

    高野さま
    はじめまして。WINGSプロジェクトの高江と申します。
    詳細な書評とご指摘、ありがとうございました。
    ご指摘いただきました誤りにつきましては、WINGSプロジェクトのサポートページにて
    訂正事項を掲載するようにいたします。

    ・p.100 匿名メソッドを定義する
    ご指摘のとおり、本文のC# 3.0(.NET Framework 3.5)は、C# 2.0の誤りでした。

    ・p.101 ラムダ式を利用する
    ご指摘のとおり、クラス名の表記誤りでした。
    (配布サンプルソースでは、 SampleDelegate3 となっております)

    ・p.102 共変性/半変性の型パラメータを利用する、
    サンプルを削ったときに、コメントの修正が漏れておりました。

    ・p.103 イベントを宣言する
    ・p.104,106 例外に関する記述
    ご指摘、今後の参考とさせていただきます。

    ・p.107 usingを用いてリソースを破棄する
    ご指摘のとおり、このサンプルでのtry-catchは、誤解を与えかねないもので、
    不適切でした。

    返信

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中