連載:C# 4入門

第1回 dynamic型

株式会社ピーデー 川俣 晶
2010/07/16
Page1 Page2 Page3

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 従来型のコード

found 2
リスト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型という新機能も、そのような流れを加速させる一因となるだろう。

 

 INDEX
  C# 4入門
  第1回 dynamic型
  1.C# 4がやってきた
    2.dynamic型/ダック・タイピング
    3.dynamic型と匿名型/dynamic型と動的言語/まとめ
 
インデックス・ページヘ  「C# 4入門」

@IT Special

- PR -

TechTargetジャパン

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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

ホワイトペーパーTechTargetジャパン

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH