連載:[完全版]究極のC#プログラミング

Chapter1 C# 3.0らしいプログラミングとは?

川俣 晶
2009/07/31

1.1 意外性あり? 本書で解説すること

 本書では、C# 2.0を含むC# 3.0(以後、C# 3.0という名称は2.0を含むものとして使う)をテーマに、C# 1.xより拡張、変更された点とそれらの使い方について解説を行う。しかし、おそらく多くの読者にとって、予想を大きく裏切る“大きな意外性のある”内容を含むことになるだろう。

 なぜか? それは、C# 3.0では、C++ → Java → C# 1.xといった流れとして、あたりまえのように続いてきたOOP(Object Oriented Programming:オブジェクト指向プログラミング)言語のソースコードの書き方そのものに変化が起こりうるからである。たとえば、if文やswitch文で条件を判断し、for文やwhile文で繰り返しを行う……という常識そのものが変化を迫られるのである*1

 「まさか、いくらなんでもそこまで変わることはありえないだろう……」と思う読者も多いと思うが、その“まさか”が起こっているのである。

 念のためにいえば、これは「そのように変えるべきである」という「べき論」ではない。明らかにC# 3.0とは、そのように変化した新しいプログラミングを支援するように設計されていて、すでにそのようなプログラミングをあたりまえのように実践しているプログラマーも珍しくはないのである。

*1 if文が変わる例については、本章のリスト1.1とリスト1.2で紹介している(リスト1.1にはあったif文がリスト1.2では消える)。繰り返しの変化はコレクションのForEachメソッドなどに見られる。

【C#olumn】C# 3.0の適用範囲

 はじめに重要なことを記しておこう。

 C# 3.0あるいは開発環境であるVisual Studio 2008の適用範囲はどこまでか、についてである。つまり、何を対象に開発するときに、それらを使用できるのかについてである。

 わりとよくある誤解として、これらは.NET Framework 3.5専用であり、.NET Framework 2.0を対象に開発するときには依然としてVisual Studio 2005とC# 2.0が必要だという認識が見受けられる。

 しかし、この認識は間違っている(最初、筆者も誤解していた)。.NET Framework 3.5とは.NET Framework 2.0+アルファであり、「+アルファ」の部分を使用しない限り、Visual Studio 2008とC# 3.0で開発されたプログラムは.NET Framework 2.0上で実行できる。

 しかも、これは簡単に実践できる。Visual Studio 2008でプロジェクトのプロパティを開き、[アプリケーション]タブを開くと、フレームワークのバージョンとして2.0、3.0、3.5を選ぶことができる(図1.1参照)。

図1.1 プロジェクトのプロパティで対象のフレームワークを簡単に選択できる

 ここで.NET Framework 2.0を選べば、Visual Studio 2008+C# 3.0で.NET Framework 2.0用のプログラムを開発できるのである。実際、筆者が書いたプログラムの1つは、まさにこのようなものである。

 ただし、ここで注意が必要である。このようなやり方によって使用できる機能と使用できない機能が存在する点である。ラムダ式(第6章、第7章参照)のような構文上の新機能は使用できるが、クラスライブラリ側の支援が必要となる「LINQ」(第15章〜第18章参照)のような新機能は使用できない。つまり、C# 3.0の全機能を使用できるわけではない。しかし、使用できる機能だけでもかなり有益であり、特に問題がなければ、.NET Framework 2.0向けの開発案件であってもVisual Studio 2008+C# 3.0に移行するのは良い選択だと思う。

 ちなみに、Visual Studio 2008のほうが、2005よりもメモリやCPUパワーなどの要求リソースが多いようである。リソースに余裕がないケースでは無理に移行しないほうがよいかもしれないが、マシンにパワーがあればVisual Studio 2008+C# 3.0に移行する価値は大きいと思う。

【C#olumn】筆者の来歴 ―― C# 1.x → C# 3.0ではない

 余談だが、このようなことを語る筆者の立場を書いておこう。

 筆者は、C#が誕生した頃に即座にC#プログラマーとなり、これをたっぷりと堪能した。しかし、C#の限界も感じるところがあり、より良いプログラミング言語の候補としてC++/CLIに魅力を感じつつも、結局縁がなく、それを使い込む機会はなかった。

 その代わりに筆者が使うことになったのは、昔懐かしいC言語と、Webブラウザに標準装備されているJavaScriptであった。筆者が、さるパソコン誌で行っているCに関する連載は毎年テーマを変えつつ、ついに4年目に突入しており、C人気の高さを痛感させられている。読者の手ごたえというレベルでいえば、まだOOPは常識ではないのである。

 一方、Ajaxにかかわることになった筆者は、必然的にJavaScriptプログラミングも行うようになった。とはいえ、実は筆者が書いたコードの多くは一般的な意味でのAjaxプログラムではなく、Windows VistaのサイドバーガジェットやWindows Liveガジェットが多い。しかし、JavaScriptプログラミングに浸ったことに間違いはない。

 このとき筆者が作ったプログラムの多くはイースト株式会社(http://www.est.co.jp/)との共同開発の形を取っていて、次のプレスリリースで見ることができる。

 Vistaだけじゃない、W-ZERO3やMS-IMEをもっと楽しくする
 PCホビイストをピーデーとイーストは応援します
 http://www.est.co.jp/press/070426.htm

 このうち、「ワンべぇWM」はCとC++の混在、「aimemon」はC++だが、実質的にOOPとしての機能は使っておらず、ほとんど生のWin32 APIを直接呼び出すCプログラミングそのものである。そのほかはすべてJavaScriptで書いたコードである。

 その結果として、筆者は「クラスのあるプログラミング」から一時的に完全に隔離されたといってよい。これは、後出のクラスが存在しないOOP言語の話題への伏線である。クラスから隔離されたことでクラスがあたりまえだと思う状況から脱却できたわけである。

 また、上記のプレスリリースには書かれていないが、最近まったくの趣味で、いわゆる同人ゲームも書き始めた。18歳未満には向かないものであるが、すべてを文字だけで表現するという渋い内容で、絵や音楽はまったく含まれない(そういうものを期待する人が興味を持っても肩すかしになる。過剰な期待はしないように)。それはさておき、このプログラムは単なる娯楽なので、とりあえず資料を引かなくてもコードをサクサク書ける手慣れたC#で書こうと考えた。そして、C# 2.0を使い始めたわけである。

 だが、その結果は自分でも驚くほどであった。

 なにしろ、匿名関数*2をバリバリ書いて変数や引数にどんどん渡すというJavaScriptのノリをそのままC# 2.0の世界に持ち込むことができ、しかも、よくなじんだのである。それはもう、“持ち込むことができる”どころの話ではなく、そういうプログラミングを行うためにC# 2.0と.NET Framework 2.0は設計されていると考えるしかなかった。そして、その思いは、C# 3.0や.NET Framework 3.5への進化を見て、ますます強くなった。

 つまり、筆者はC# 1.xプログラマーの立場ではなく、CとJavaScriptのプログラマーの立場からC# 3.0を扱っていて本書を書いているわけである。そして、C# 3.0が持つすべての能力を解放するためには、JavaScriptに代表されるようなクラスのない文化から学ぶことが不可欠であると考えている。

*2 匿名関数はJavaScriptの機能の1つで、C#の匿名メソッドやラムダ式にほぼ相当する。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter1 C# 3.0らしいプログラミングとは?
    1.はじめに/本書の位置づけ
  2.1.1 意外性あり? 本書で解説すること/C# 3.0の適用範囲/筆者の来歴
    3.1.2 C# 3.0らしいソースコードとは?
    4.1.3 コードの遅延実行という例
    5.1.4 インターフェースとの比較
    6.1.5 後退するクラスの立場
    7.1.6 クラスベースとプロトタイプベース
    8.1.7 クラスベースの問題点/【C#olumn】クラスの問題とは何か?
    9.1.8 JavaScriptとの相違点
    10.まとめ/【C#olumn】金のハンマーと銀の弾丸―クラス至上主義
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間