C# 3.0とは何か？

C#も順調にバージョンアップを重ね、ついに「3.0」である。連載を開始するに当たり、前置きとしてこの連載で扱うC# 3.0とは何かを簡単に紹介しておこう。

C# 3.0は、動的かつタイプセーフなオブジェクト指向プログラミング言語である。「動的」とは、実行するまで内容が確定しない要素が多いことを意味し、「タイプセーフ」とは、あらゆるデータに「型」が存在し、コンパイル時、あるいは実行時にそれが厳格にチェックされることを意味する。そして「オブジェクト指向プログラミング言語」とは、データとプログラムの入れ物である「オブジェクト」を前提とした言語であることを示す。

しかし、これらの特徴はC# 2.0から継承されたものであって、必ずしもC# 3.0固有のものではない。C# 3.0ならではの特徴とは何だろう？

筆者の個人的な印象だが、C# 3.0は言語が持つ個々の機能について技術解説される機会はあれど、言語そのものについて語られる機会は少ないと感じている。例えば、「ほかの言語と比較してJavaは（あるいはRubyは）これほど素晴らしい」と語る文章をしばしば見掛ける。しかし、C# 3.0に関する文章は、個別技術の内容や使い方を淡々と語るものばかりで、ほかの言語と比較する文章や、素晴らしさをたたえる文章にはあまり遭遇しない感がある。

では、C# 3.0が使われていないのか……といえばそうではない。明らかにC# 3.0を使って日々大量のコードを生み出している人たちがいる。筆者もその1人である。

なぜ彼らが語らないのか、正確なところは当人たちに聞かないと分からないだろう。しかし、筆者が語らない理由は簡単に説明できる。技術者とは語る者ではなくコードを書く者であって、満足のいくコードさえ書ければそれだけで満足してぐっすり眠れる人種である。そして、C# 3.0によってストレスを残さず書きたいコードをすべて書き切れているのである（しかし、このような記事を書いて語ってしまっている理由も簡単である。ライターという人種は語る者だからである。筆者はライターでもあり、二足のわらじを履いている）。

このことは、以下のことを示唆する。

世の中には語りによって補強しなければ優秀さを説得できない言語と、コードを書くことを経由しなければ優秀さを納得できない言語がある

これは、C# 3.0の特徴を理解するには、言葉による説明ではなくコードを見ていかねばならないことを意味する。それも、短いサンプル・コードではなく、ある程度以上の規模を持った本格的なプログラムでなければならない（しかし残念ながら、このような連載記事で長いコードをお見せすることはできない。短いサンプル・コードで解説することをお許しいただきたい）。

では具体的にコードから伝わってくるC# 3.0の特徴とは何だろうか？

それは、あいまいさを一切排除した厳格な型の扱いを維持しつつ、徹底的に少ない文字数でコードを書けるようにしたことではないかと思う。

典型的な例は、今回の主題でもある「ラムダ式」だろう。ラムダ式が持つ機能性は、C# 2.0が持つ匿名メソッドと何ら変わることはない。変わったのは主に、より少ない文字数で書けるようになったことである。

また、C# 3.0の新機能である「暗黙的に型指定される変数」も同様に文字数を減らす効能がある。初期化する値によって型が明確であれば、変数宣言に、

SpecialHighReadabilityTypeName<AnotherHighReadabilityTypeName>

のような長い型の名前を書かずに、

var

と3文字書くだけで済ませられる（この新機能については次回以降で解説予定）。

しかし、コードが短くなることの効果は絶大である。まず当然のことながら、書くための手間が減る。Visual StudioのIntelliSense（インテリセンス）を併用しても、明らかにタイピング量が減る。（体力で押し切れる若いころはピンとこないかもしれないが）完全に同じ意図を記述するものであれば、タイピング量の差は生産量の差として明確な差が生じ得るものである。

そしてもっと素晴らしいのは、読むための手間が減ることである。1画面に表示できる文字数、目が受け取ることができる情報量に限りがある以上、同じ意図をより少ない文字で表現する方が、より多くの情報を受け取ることができる。それにより、コードを読むためにスクロールさせる頻度も減るし、コードを読むときに特に意味を持たない形式的なキーワードを排除して、意味のある部分を切り分ける手間も減る。

問題は、あいまいさがなく、より短い文字数で同じ意図を記述するために、まったく新しい構文が導入され、それを覚えねばならないことである。また、慣れない構文でいくら短く書けても、それでソース・コードが読みやすくなるわけではない。

しかし、そのことは大した問題とはならない。なぜなら、C# 3.0とはひたすらコードを書くことに奉仕する言語であり、C# 3.0プログラマーになるということは、大量のコードを無理なく生産する立場に立つことを意味するからだ。少数の目新しい構文など、大量のコードを書いているうちにすぐ慣れてしまうだろう。逆にいえば、コードを書き続けることによって、何かを成し遂げようとする者のための言語がC# 3.0であるともいえる。

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を選ぶことができる。



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

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

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

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