C# Version 3.0 Specification September 2005

http://msdn.microsoft.com/vcsharp/future/
http://download.microsoft.com/download/9/5/0/9503e33e-fde6-4aed-b5d0-ffe749822f1b/csharp%203.0%20specification.doc

 2.0が正式リリースにならないうちから3.0の情報が順調にでてきています。興味があるものですから、OKなんですけどね。

 例のコードをざっと見てわかるところから抽出してみます。

Implicitly typed local variables / 暗に型付けされたローカル変数

 varキーワードで型推論ができるようです。例は次の項目に譲ります。

Object initializers / オブジェクト初期化子

 省力化できて便利そうです。記法のみあげると、

var a = new Point { X = 0, Y = 1 };

と、プロパティの初期化をさらっと書けるようになるわけですね。

Collection initializers / 集合初期化子

 同じく楽になりそうです。

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

Anonymous types / 無名型

 クラスの型を明示するまでもない用途でしょうか。自動的にクラスが作成され、明示的な名前がないと見ればよいようです。

var p1 = new { Name = "Lawnmower", Price = 495.00 };
var p2 = new { Name = "Shovel", Price = 26.95 };
p1 = p2;

Implicitly typed arrays / 暗に型付けされた配列

var c = new[] { "hello", null, "world" };		// string[]

Query関連

 新要素の何割かはデータベースのような言語との統合的構文のようです。
 よく読んでみる必要がありそうです。

追加キーワード
  • where節
  • select節
  • group節
  • orderby節
  • into節

Extension methods

 あるクラスのメソッドを追加したように振舞うユーティリティな静的クラスを作成する機能のようです。例えば、出来合いのクラスがあるけど、欲しい関数が実装されていないとします。こんなときに、Extension methodsを使うと、あたかももとのクラスにそのメソッドがあるかのような記法でスマートにコーディングできるようです。
 そしてどうやら、この追加は、Query関連をスマートに記述するためにも役立つようです。

using Microsoft.DirectX;
using MyUtilities;

namespace MyUtilities {
    public static class QuaternionUtility {
        public static Quaternion Even(this Quaternion a, Quaternion b) {
            return new Quaternion(
                a.W * b.X + b.W * a.X,
                a.W * b.Y + b.W * a.Y,
                a.W * b.Z + b.W * a.Z,
                a.W * b.W - a.X * b.X - a.Y * b.Y - a.Z * b.Z);
        }
    }
}
public static class Program {
    public static void Main() {
        var a = new Quaternion(1, 2, 3, 4);
        var b = new Quaternion(5, 6, 7, 8);
        var c = a.Even(b);                    // QuaternionUtility.Even(a, b);
    }
}

Lambda expressions / ラムダ式

Func<string, bool>   filterByLambda    = s => s.Length == 5; // ラムダ式で記述した場合
Func<string, bool>   filterByDelegate  = delegate(string s) { return s.Length == 5; }; // デリゲートで記述した場合

 C# 2.0のanonymous methods(無名メソッド)からの自然進化とのことです。

Expression trees

 ラムダ式によってデータ木構造を実行コード(デリゲート)を使わずに表現できるということのようです。