|
|
連載:C# 4入門
第1回 dynamic型
株式会社ピーデー 川俣 晶
2010/07/16 |
|
C# 4がやってきた
6月19日に行われた「第3回 .NET中心会議」にパネラーとして出席させていただいた。
その際、実は大きな思い違いをしていたことに気付いた。多くの開発者はMSDNの契約を行っていて、サブスクライバー・ダウンロードからすでにVisual Studio 2010を入手済みであることは前提。しかし、まだ開発プロジェクトで本格的な利用はされておらず、現行のVisual Studio 2008から本当に移行してよいか悩んでいる……と思っていた。
しかし、実態はそうではなかった。実は、2008をスキップして2005から2010に進むことを検討しているユーザーが多いどころか、Visual Basic 6.0からの移行という計画を持っているユーザーすらまだいる。しかも、いまだにJavaというユーザー層までいて、恐らく彼らはVisual Studioですらない。Ecliseという名前は、私から見ればすでに聞かなくなって久しい「過去の流行ワード」だと思っていたが、彼らにはまだ生々しい現実であり、物事を判断するための前提となっているのだろう。
このような「2008飛ばし」という現象は、実は2010に対する位置付けを大幅に塗り替えてしまう。というのは、2008(.NET Frameworkは3.5)から始まったLINQやラムダ式を多用するスタイルは、2010に至っては、それらの機能を使うか否かではなく、どう無駄なくコンパクトに切り詰めていくかという段階に入っており、2010の紹介を行うとすればそれが前提になってしまうためだ。しかし、2008を飛ばした技術者は、そのための前提を飛ばしてしまったため、そもそもソース・コードを読んでもピンと来ない可能性がある。
以下に一例を出してみよう。ある配列に、特定の値が何個入っているか調べようとした例である。もちろん、実際にこのようなプログラムを書いているわけではないが、エッセンスを抽出したものと思っていただきたい。
これを従来型のコードで書いてみよう。これは「プレ2008世代」でも容易に理解できると思う。
using System;
class Program
{
static void Main(string[] args)
{
int[] a = { 1, 3, 2, 4, 2 };
int count = 0;
foreach (var n in a)
if (n == 2) count++;
Console.WriteLine("found {0}", count);
}
}
|
|
リスト1 従来型のコード |
ところが、「ポスト2008世代」になると、すでにループを回さない。クエリ式をインスタンス化させれば、ループさせる必要がないのである。
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
int[] a = { 1, 3, 2, 4, 2 };
var query = from n in a where n == 2 select n;
Console.WriteLine("found {0}", query.Count());
}
}
|
|
リスト2 LINQのクエリ式を利用 |
かなり短くなったが、まだ手ぬるい。
実は、筆者は最近、以下のように書いてしまう。なぜかといえば、メソッド形式にすれば、from句やselect句に相当するものは書かなくても済むからである。ちなみに、以下はMainメソッドの内容だけである。
int[] a = { 1, 3, 2, 4, 2 };
Console.WriteLine("found {0}", a.Where((n) => n == 2).Count());
|
|
ずいぶんと短いコードを書いてしまったものだと感慨にふけってしまったが、実はまだ甘かった。Countメソッドのオーバーロードには、条件を記述できるものが存在する。これを使うと、Whereメソッドすら呼ばずに以下のように書けば終わってしまう。
int[] a = { 1, 3, 2, 4, 2 };
Console.WriteLine("found {0}", a.Count((n) => n == 2));
|
|
最初の例と意図も厳密さも同等でありながら、ここまで短くすることができた。これが恐らく2010世代のコードといえるだろう。LINQを手探りで使った2008時代はもう終わり、極限まで無駄を切り詰めて書いていく時代に入ったといえる。
問題は、「2010のメリットを教えてください」といわれたとき、こういったコードを書いて説明してしまうと、「プレ2008世代」には、もはや何をしているのかという雰囲気すらつかめなくなってしまう可能性があることだ。つまり、「2008スキップ組」にはそれだけの難しいリスクがつきまとうわけである。そして、恐らくVisual Studio 2010はラスト・チャンスだろう。ここで時代に追いついておかないと、サンプル・ソースすら読めない状況にもなりかねない。そして、C#とは、そういうダイナミックな変化をしてまで、より短いコードを追求していく言語なのである。
今回取り上げるdynamic型という新機能も、そのような流れを加速させる一因となるだろう。
Insider.NET 記事ランキング
本日
月間