かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

C#3.0の素晴らしいと思うたった5つの点

C#2.0からあったよ!とかいう機能もありますが、個人的に素敵だと思うところをあげてみました。
たった5つだけど、どれも素敵です。

1.静的な型の言語である

最近動的な型の言語のいい所が取り上げられてるけど、静的な型のほうがメソッドやクラスの仕様を使う人にわかりやすく宣言できるので個人的には静的な方が好きです。

2.でも動的な型の言語っぽい書き方が出来る

1で書いたように、外部に対してメソッドやクラスの仕様を宣言を見るだけで明らかに出来るのはいい事だと思うけど、メソッドの中とかみたいに他人とは関係ない世界では好き勝手に書きたくなる。
C#3.0は、まさにそういう書き方が出来る。

型が明らかなときにはvarで省略できるし、匿名型で好き勝手にその場しのぎのためだけの型を用意できる。

var intArray = new[] {1,2,3,4,5,6}; // int[]なのが明らかなので省略可能
var tokumei = new { Name = "太郎", Age = 12 }; // NameとAgeプロパティのある型が出来る

外に対してはきっちりと書く。中では書きたいことをだけを書けばいい。
そんな言語だという印象を受けました。

3.LINQがある

この間、受け取ったデータを集計したり、何か処理したりっていう事をするアプリを書いたんですが、その時にLINQがあったら一行なのに…とか思っちゃいました。

「従業員のリストに対して給料が100万円以上の人に対して"〜さん羨ましいなぁ"という文字列を作る」みたいな、ありがちな事が非常に直感的に書けるようになります。

// 従業員クラス
class Employee
{
    public string Name { get; set; }
    public int Salary { get; set; }
}

--------------------------------------------------
// 従業員のリスト
List<Employee> employees = new List<Employee> 
                            { 
                                new Employee { Name = "太郎", Salary = 1000000 },
                                new Employee { Name = "二郎", Salary = 1500000 },
                                new Employee { Name = "三郎", Salary = 900000 },
                                new Employee { Name = "四郎", Salary = 200000 },
                                new Employee { Name = "五郎", Salary = 3000000 },
                                new Employee { Name = "六郎", Salary = 10000 },
                                new Employee { Name = "七郎", Salary = 300000 },
                                new Employee { Name = "八郎", Salary = 3000 },
                                new Employee { Name = "九郎", Salary = 10000000 },
                                new Employee { Name = "十郎", Salary = 990000 }
                            };

// 従業員のリストに対して給料が100万円以上の人に対して"〜さん羨ましいなぁ"という文字列を作る
// Normal version
{
    List<string> messages = new List<string>();
    employees.FindAll(delegate(Employee emp)
    {
        return emp.Salary >= 1000000;
    }).ForEach(delegate(Employee emp)
    {
        messages.Add(string.Format("{0}さん羨ましいなぁ", emp.Name));
    });
    messages.ForEach(delegate(string message)
    {
        Console.WriteLine(message);
    });
}
// C#3.0 version
{
    var messages = from emp in employees
                   where emp.Salary >= 1000000
                   select string.Format("{0}さん羨ましいなぁ", emp.Name);
    foreach (var message in messages)
    {
        Console.WriteLine(message);
    }
}

C#2.0でもForEachとかみたいなメソッドを使えばアッサリと書けてるじゃん。と思うけど、LINQの素晴らしいと思う所は「データ構造と、それに対する操作が分離されてる」という所だと思います。
ForEachとかFindAllとかは、Listにしかありません。配列だとNG。独自コレクションクラスもNG。
forループかforeachでグルグルまわして泣くしかないです。

でも、LINQはIEnumerableというインターフェイスを実装してるものなら何でも食わせれます。
配列OK、独自コレクションもOK、DLINQならDBに対してもOK、XLINQならXMLに対してもOK。
データ構造を気にせずに、同じように書ける。そしてパワフル。
C++STL以来の衝撃です。惚れました。

4.自動生成ツールとの相性がいい(これは2.0からだな…)

partialクラスがツールとの相性がいい感じです。
クラスの定義を複数にわけてもコンパイル時にまとめ上げてくれる。
たったこれだけの機能だけど、ツールによる自動生成部分と人手によるカスタマイズ部分を簡単に分離出来るのがいい。


これが無いとGeneration Gapパターンを使うか、ソースコードにマーキングをしてツールが凄く頑張るか、ツールに上書きされて人が泣くかということになります。

5.ラムダ式が使える

あるのと無いのとじゃ実質できる事に差は無いけど、あるとやっぱり嬉しいものの1つ。
LINQでも裏でガリガリ使われてる縁の下の力持ち。