C# の初歩から応用まで説明する。旧版はハーバート・シルトによる独習 C# である。
ドキュメンテーションコメント /// が pp.27-29 で説明されている。使ってみたい。
表2.2に識別子の記法として、camelCase 記法と Pascal 記法、 アンダースコア記法の概要と例が記されている。そして、 C# の慣例では、変数は camelCase 記法で、それ以外は Pascal 記法で命名するのが一般的である、 と書かれている。なお、第7章参照。
へんな読み方だが、私はここからコードを追っていった。そのとき困ったのは、 リストのあちこちにある PrintList というメソッドだった。 この PrintList について本文では 「(PrintList メソッドは、リストの内容をカンマ区切りで出力するための自作のメソッドです」 と書かれているが、このメソッドをどのように実装しているかは書かれていない。 仕方がないので、次のようなメソッドを Main の直後に書いてごまかしているが、 最終要素のあとと改行の間にカンマが入ってみっともない。
void PrintList(LinkedList vs)
{
foreach (var s in vs)
{
Console.Write(s + ", ");
}
Console.WriteLine("");
return;
}
実にどうでもいいことだが、C# は JIS(日本産業規格) として規定されていて、その規格番号は JISX3015 である。なぜこんなことを持ち出したのかというと、コンストラクターという表記に違和感を覚えたからである。 -er や -or で終わるカタカナ語で語が長い場合、末尾の長音はふつう表記しないからである。 JIS であればどのように表現されているのか知りたくなったからだ。 JIS では、「構築子」であった。ちなみに、本書ではコンストラクターと対になるのはやはり「デストラクター」 であり、こちらの JIS は終了化子であった。ついでに、本書のイテレーターは、 JIS では「反復子」と訳されている(JIS 8.18 参照)
p.247 に、クラスの命名は Pascal 記法で統一すること、とある。 Pascal 記法とは、すべての単語を大文字で始める記法であり、Upper CamelCase (UCC) 記法ともいう、 ということが説明されている。なお、第2章の記述も参照。
わたしは無知だから、ラムダ式の有用性がわかっていなかった。今でもわからない。 それでもひょっとしたら、と思うことがある。それは C 言語を学んでいたときのことである。
C 言語の標準ライブラリーに、qsort という関数がある。この関数は、変数を4つとる。 第1変数はソートをする対象である配列だ。 第2変数は配列対象の個数である。第3変数は配列要素のサイズである。 これらの最初の3変数は配列を特定するために必要でかつ十分なパラメーターだ。 そして、第4引数が比較関数である。ここに関数のポインタを入れる。
C 言語の仕様では、関数のポインタをいれないといけないわけだから、 関数を定義する必要がある。 しかし、ソーティングするためだけに関数に名前をつけるのは非効率ではなかろうか、 と思っていた。たいてい、こんな関数を書くわけだ。
int compare(const void *p, const void *q)
{
return strcmp(*(char **)p, *(char **)q);
}
この関数を何度も使いまわすのならば関数として作成した意味があるけれど、 このソーティングだけに関していえばそのときだけに必要ということになるのならば、 関数を作る意味はなく、正確には関数を作る必要はあるがそれに名前を付ける意味はなく、 なぜか「もったいない」と思っていた。そんなとき、LISP や何かで無名関数のことを知った。 無名関数とは何かを学んだとき「なぜ無名関数があるのか。関数に名前をつけなければ、 その関数を使うことはできないではないか」と思ったのだった。自分で qsort の compare のことを、 すっかり忘れていたのだ。自分の無知さにはほとほと呆れる。 その後、プログラムを書くのは JavaScript だけになった。いろいろな課題にあたるなかで、 配列のソーティングを行なう必要が出てきて、初めてそこで無名関数の必要性が認識できたのだった。 ちなみに JavaScript では無名関数のほかにアロー関数という概念がある。 アロー関数は無名関数の省略記法であるが、完全に同等というわけではない。
C# に戻って、C# にも配列がある。C# の配列をソーティングするライブラリというのはあるのだろうか。
そんなことを考えながら本書の索引を見ると、第6章 コレクション の p.239 に補足として配列/リストのソートという項があった。 配列の場合は Array クラスの Sort メソッドを、 またリストの場合は List クラスの Sort メソッドを使えばよい。 さらに、<Sort メソッドは Comparison デリゲートを受け取ることもできます。> とある。デリゲートは匿名メソッドやラムダ式の基本となるものだから、ここで私の考えはつじつまがあう。
書 名 | 新版 独習C# |
著 者 | 山田 祥寛 |
発行日 | 2017 年 12 月 15 日 |
発行元 | 翔泳社 |
定 価 | 3600円(税別) |
サイズ | |
ISBN | 978-4-7981-5382-7 |
備 考 | 越谷市立図書館で借りて読む |
NDC | 007.6 |
まりんきょ学問所 > コンピュータの部屋 > コンピュータの本 > C++, C# > 山田 祥寛:新版 独習C#