C#3.0言語仕様

C#3.0の言語仕様が公開された。

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


以下、ワシが勝手に解説!(`ω´) 長文注意。


・暗黙に型づけされたローカル変数(implicitly typed local variables)


var i = 5;
var s = "Hello";
var numbers = new int[] { 1,2,3 };
var order = new Dictionary<int,order>();
var i; // エラー! 型が特定できない。
var y = { 1,2,3 }; // エラー! 配列初期化子は許されていない。
var z = null; // エラー! nullも型が特定できない。

ということで、(あまり賢くない)型推論機能。そのへんがちょっと残念だが、便利であることには違いない。


・拡張メソッド(extension methods)

メソッドをあとからclassに追加するための構文。mix-inっぽいことが実現できる。


namespace Acme.Util {
public static class Extensions {
public static int ToInt32(this string s){
// 引数に指定してあるthisに注目。
return Int32.Parse(s);
}
}
}
としておいて
using Acme.Util;

string s = "1234";
int i = s.ToInt32();


・ラムダ記法(lambda expression)

C#2.0の無名メソッド(anonymous method)が冗長だったのでその改良版。


x => { return x+1; } // 暗黙に型づけされた 文(statement)本体
(int x) => x + 1 // 明示的に型づけされた 式(expression)本体
(int x)=>{return x+1;} // 明示的に型づけされた 文本体
(x,y) => x * y // 複数のパラメータも取れる
() => Console.writeLine() // パラメータ無し

構文自体はすっきりしていて好感が持てる。これでラムダ記法でメソッドのパラメータとして式を渡した場合にきちっとinline展開してくれれば良いのだけど..。


・「オブジェクトと配列」の初期化子(object and collection initializers)


var a = new Point { X = 0, Y = 1};
List<int> digits = new List<int>{0,1,2,3};


見ての通り。


・無名型(anonymous types)


var p1 = new { Name = "よっちゃんイカ" , Price = 30 };

この場合、NameとPriceをメンバに持つクラスを自動的に作ってくれる。


・暗黙に型づけされた配列(implicitly typed arrays)


var a = new[] { 1, 10, 100, 1000 }; // int[]
var b = new[] { 1, 1.5 , 2 , 2.5 }; // double[]


・クエリ式(query expressions)


これは割愛。


(総評)

ざっと見た感じ、C#3.0(おそらくリリースは2007年ぐらい)は現在のNemerle(http://nemerle.org/)にすら完全に負けている。特に型推論がへぼすぎる。いまどきの言語としてはlambda式のサポートは当然だが、これがどういうコードが生成されるのかまで規定されていないのが怖い。C#1.0/2.0(MS VC#)のときのdelegateのようなへたれ実装だと、パフォーマンスが気になって気軽に使うことが出来ない。


.NETは素晴らしいアーキテクチャなのだが、C#等の言語機能はずいぶんと時代から遅れていると思う。