C# 3.0とかVB 9.0とかって?いまさらメモ。

@IT :動的プログラミング言語へと発展するC# 3.0とVB 9.0
記事としては2005/10/13なのでずいぶん昔のものですが、そのとき私は目の前にあるバージョンに手一杯(今もか。orz)だったわけで、現状もとりあえずこの記事しか見ていないという状況ですが、記事をまとめながらはげしくおびえてみるテストです。

C# 3.0やVB 9.0で提供される予定の機能として

があるらしいっす。どれどれ・・・


●暗黙の型指定

実際に書くとこうなる感じ。


[Visual Basic 9.0]

Dim i = 42 ' iは勝手にInteger型
Dim s = "Hoge" ' sは勝手にString型


[C# 3.0]

var i = 42; // iは勝手にint型
var s = "Hoge"; // sは勝手にstring型

Option Strict Off(Visual Basic)じゃないですよ〜。暗黙に型を指定できるようになったわけで、自明のことをわざわざ明示する必要はなくなるそうな。この辺が動的・・・?っていうか、自明のことって・・・まぁ、そうなんですけど、コーディングの手間をなくしただけでリーディングの手間は?


型推論ラムダ式

型推論


[Visual Basic 9.0]

Dim data() As Integer = {11, 3, 5, 13, 7, 17}

For Each d In data ' dはInteger型だろう
Console.WriteLine(d.GetType().Name)
Next


[C# 3.0]

using System;

int[] data = { 11, 3, 5, 13, 7, 17 };

foreach (var a in data)
Console.WriteLine(a.GetType().Name);

コンパイラが推論立ててくれるからプログラマは書かなくてもよいですよ、ってことですね。

ラムダ式
C# 2.0では匿名メソッドで以下のように書ける。


[C# 2.0]

int[] data = { 11, 3, 5, 13, 7, 17 };

Array.Sort<int>(data, delegate(int x, int y) { return x - y; });

これがラムダ式になるとこう。

[C# 3.0]

int[] data = { 11, 3, 5, 13, 7, 17 };

Array.Sort<int>(data, (x, y) => x - y);

現状、Visual Basic 9.0での実装は公開されていない(検討中な様子)だそうです。

引数 => 式
といった形で書くそうな。これ・・・キツイなぁ。読みにくぅい(私だけでしょうか?)。Visual Basicではもう少し助長な感じでお願いしたい。


●Extension Methodsの導入

定義されている型のオブジェクトにメソッドを追加できる(ように見える)機能だそうです。


[C# 3.0]

using System;

static class ExtensionMethodClass {

internal static string ToXML(this Person source) {

return string.Format("<Person><Name>{0}</Name><Age>{1}</Age></Person>", source.Name, source.Age);

}

}


class Person {

internal string Name;
internal int Age;

}

static class App {


static void Main() {

Person p = new Person();
p.Name = "とりこびと";
p.Age = 27;
Console.WriteLine(p.ToXML());

}


}

ん〜ほぼリンク先そのまんま引用ですが・・・。あとのせサクサクですか?乱用禁止だなぁ・・・。きっと読めなくなるし。


●クエリの統合「LINQ

クエリっぽくかけるんです。WhereとかSelectとか。


[C# 3.0]

Array.Sort<int>(data, (x, y) => x - y);

IEnumerable<int> result = data.Where<int>(delegate(int x){ return x > 7; }).Select<int, int>(delegate(int x){ return x; });

foreach (int a in result)
Console.WriteLine(a);

うむ・・・ついていけないな。orz
さらにこれが、

[C# 3.0]

foreach (var a in from x in data where x > 7 select x)
Console.WriteLine(a);

なんぢゃぁ〜これわ!Visual Basicで書くとこうなるらしい。

[Visual Basic 9.0]

For Each a In Select x From x In data Where x > 7
Console.WriteLine(a)
Next

・・・まだいける・・・かも・・・。