C#5.0入門書の決定版 – 書評:『スラスラわかるC#』

スラスラわかるC# (Beginner’s Best Guide to Programmin)

一通り読み終えたので、感想も兼ねて書評を。

タイトルでも書いた通り、本書は、C#5.0の入門書として、日本語で読めるものの中ではベストだと思う。C#は結構言語仕様が大きくて、便利機能がたくさんある反面、覚えることも多い。

C#入門者の多くはWindowsでデスクトップアプリが作りたくて学び始めると思うけど、GUIの作り方とC#の書き方を並行して覚えるのはかなり大変。急がば回れで、まず言語仕様を押さえてから、GUIの作り方を学んだほうがよいと思う。

本書『スラスラわかるC#』の良いところは、解説を言語仕様に絞って、適切なボリュームで、十分なサンプルコードとともに説明しているところ。

言語仕様解説のコンパクトさなら『パーフェクトC#』のほうが上だけど、コンパクトすぎてサンプルコードが少ないという問題がある(その割に結構詳しいことまで解説しているので、行間を補いながら読む必要があり、プログラミング経験者でも、C#未経験の場合は読みこなすのが難しい)。

なお、表紙を見ると「プログラミング知識ゼロでも大丈夫」的なことが書いてあるが、鵜呑みにしないこと。これでプログラミング入門は相当難しい。逆に、ifとかforとかいった制御構造にやたら分量をとっていたり、オブジェクト指向とは…的な内容を延々語ってたりすることがないので、プログラミング経験者でも無駄なく学ぶことができる。

今年にはC#6.0が出るけど、それほど大きな言語仕様の変更があるわけではないので、あと2, 3年は本書の価値は失われないはず。

.NET Frameworkのクロスプラットフォーム戦略は、Javaが20年前に通った道をこれから歩むのか…って感じでちょっとつらそうだけど、C#にはUnityという強力なサポーターが生まれたし、C#の言語仕様は静的型付けのオブジェクト指向言語の中ではかなり先進的(Java8には2014年に入ったラムダ式を、C#は2007年のC#3.0でサポートしていた)。Windows環境があるなら、学んで損はない。

『スラスラわかるC#』補足資料2 読書メモ

スラスラわかるC# (Beginner’s Best Guide to Programmin)

unsafe

C#では、プロジェクトの設定でアンセーフコードの許可を行い、かつ、unsafeキーワードによって囲まれたブロックに限って、以下の機能を使用できる。

  • ポインター
  • 配列の静的確保(stackalloc)
  • sizeof演算子
  • アドレス固定(fixed)

これらの機能は、以下の条件を満たすアンマネージド型に限って利用できる。

  • 値型である
  • 構造体の場合、アンマネージド型のみをメンバーに含むこと
  • ジェネリックではないこと

プラットフォーム呼び出し(Platform Invoke, P/Invoke)

C#からネイティブの機能を呼び出す方法には、DllImportとCOMオブジェクトがある。

DllImport

DllImport属性を付けた静的メソッドを作成すると、DLL中のネイティブ関数を呼び出すことができる。外部で定義された関数を参照するには、メソッドにextern修飾子をつける。

COM参照

.NET Framework以前にあった、コンポーネント間の連携の仕組みにCOM(Component Object Model)がある。COM参照を使用することで、C#で作成したアプリケーションからInternet ExplorerやExcelを呼び出すことができる。

補足資料2は本当に補足という感じ。…といいつつ、DllImportとかは実案件だと割と使いそう。

『スラスラわかるC#』補足資料1 読書メモ

スラスラわかるC# (Beginner’s Best Guide to Programmin)

型情報

クラス名やメンバ名等の情報をメタデータ(型情報)と呼び、プログラムの実行時にメタデータを取り出すための機能をリフレクション(reflection)と呼ぶ。リフレクションで得られる型情報のことを実行時型情報(Runtime Type Information)と呼ぶことがある。

実行時型情報

リフレクションを使用することで、文字列から動的にインスタンスを生成することができる。ただし、リフレクションを使った処理は、通常の処理に比べると数千倍ほど遅いため、注意が必要。

属性

属性(attribute)とは、クラスやメンバーに追加の実行時情報を与えるものである。属性の情報は以下のような場面で使われる。

  • 条件コンパイルなどの、コンパイラへの指示に使う(Conditional, Obsolete)
  • 作者情報などをメタデータとしてプログラムに埋め込む(AssemblyTitle)
  • リフレクションを利用して、プログラム実行時に属性情報を取り出して利用する

以下のコード例では、Conditional属性を使用している。SHOW_INTERMEDIATEというシンボルが定義されているときはInterMediateOutputメソッドが実行される。

式ツリー

ラムダ式をExpression型の変数に代入すると、式ツリーデータとして扱うことができる。式ツリーデータとして扱えるのは単文のみ。

式ツリーは、Compileメソッドを呼び出すことで動的にコンパイルして実行することができる。

動的変数

C#4.0で、動的型付け変数(dynamic型)が追加された。

C#のdynamicは、「型が動的」というよりは、「静的な型に対する動的コード生成」といったほうが正しい。

リフレクションやdynamic型は「補足資料」の位置づけでも良いと思うけど、属性はC#でアプリケーションを書くなら絶対に知っておく必要がある事項なので、補足資料に回されてしまっているのは疑問。

『スラスラわかるC#』読書メモ 第11章

スラスラわかるC# (Beginner’s Best Guide to Programmin)

マルチスレッド処理

一本道でしか処理できない状態を同期(synchronous)、複数の処理を平行して行える(ある処理の実行中に別の処理を止めない)状態を非同期(asynchronous)という。

処理を動かすための基本単位のことをスレッド(thread)と呼ぶ。処理の流れが一本道なものをシングルスレッド、複数の処理を平行して行うものをマルチスレッドと呼ぶ。

C#で非同期処理を行う場合、スレッドを直接作ることはほとんどない(System.Threading.Threadを使えば直接スレッドを作ることは可能)。

スレッドの新規作成やスレッド間の処理の切り替えは重たい処理なので、最小限に抑える必要がある。そこで、スレッドを直接使うのではなく、一度作ったスレッドを可能な限り使いまわす仕組み(スレッドプール)がある。

.NET Framework 4.0以降では、System.Threading.Tasks.TaskクラスやSystem.Threading.Tasks.Parallelクラスを使うことで、スレッドプールを簡単に利用することができる。

排他制御

マルチスレッドプログラミングで、別スレッドの実行結果を再利用するような場合には、別スレッドの処理中は処理を止める排他制御が必要になる。C#では、lockステートメントを用いることで簡単に排他制御を行うことができる。

volatile

コンパイラは最適化の過程で無駄な変数等を削除する。しかし、マルチスレッドプログラミングでは、一見無駄に見えても、他のスレッドで値が更新される変数を用意することがある。このような変数には、volatile修飾子を付けると、コンパイラによる最適化で変数が削除されることがない。

非同期メソッド

C#5.0以上では、asyncキーワードを使うことでメソッドを非同期メソッドとして定義できる。awaitキーワードの箇所で非同期処理の完了待ちが行われる。

『スラスラわかるC#』第10章 読書メモ

スラスラわかるC# (Beginner’s Best Guide to Programmin)

列挙子

C#における反復では、列挙可能(Enumerable)及び列挙子(Enumerator)が中心的な役割を持つ。

IEnumerableインターフェースを実装したメソッドは、foreachで反復処理することができる。IEnumeratorインターフェースは、IEnumerableを実装したオブジェクトを返す必要がある。

yield returnステートメントを使うことで、列挙子を簡単に生成することができる。yield returnステートメントは遅延評価される。

LINQ

SQLに類似したキーワードを使用して、データの反復と抽出を行える。クエリ式とメソッド形式の2種類の書き方がある。