【レポート】

見えてきた次世代.NETの姿 - .NET Framework Ver2.0 C#2.0とVS2005

1 C#2.0 - 1.1の不満を解決

    小野修司  [2005/09/29]

    少し旧聞になるが、8月2日から5日までマイクロソフト主催のカンファレンス「Tech・Ed 2005 Yokohama」が開催された。このカンファレンスで、2005年11月17日にVisual Studio 2005日本語版(以下VS2005)の発表会が行われることがアナウンスされた。

    VS2005の登場と同時に.NET FrameworkはVer2.0となり、初のメジャーバージョンアップを迎える。ここでは.NET Frameworkの中核を担う言語であるC#とその開発環境について、今回のバージョンアップで強化される点をTech・Edで行われたセッションの内容をベースに紹介する。

    ジェネリック

    Ver1.1までは、不特定個数のデータを扱うには一般的にはArrayListクラスが利用されていた。ArrayListクラスは内部的にはデータをobject型として扱っているため、以下のような問題点が存在していた。

    • ArrayListからデータを取り出す際にキャストによって本来の型への変換を行う必要がある
    • 利用している型以外のデータもArrayListに追加できてしまう。この問題が起きている場合、コンパイルは正常に終了するが実行時に例外が発生する
    • 値型のデータを扱う場合は、ArrayList内でobject型に格納するためにボックス化が行われてしまい、実行速度に影響を与えてしまう

    これらの問題点を解決するために導入されたのがジェネリックである。ジェネリックを利用すると、どのような型でも同じロジックで処理できるクラスを作成することができる。またジェネリックを使用して作成されたクラスを使う場合は、クラスを定義する時点で利用したい型をパラメータとして与えるだけでよい。

    .NET Framework 2.0で提供されるSystem.Collections.Generic.Listクラスを利用するときの例をみてみよう。int型のデータを利用する場合は次のように定義する。

        List<int> intList = new List<int>;

    もし、独自に作成したTest型のデータがあり、そのデータをListで扱いたい場合には次のように定義すればよい。

        List<Test> testList = new List<Test>;

    intListからデータを取り出す際にはint型のデータが、testListからデータを取り出す際にはTest型のデータが返ってくるので、取り出したデータのキャストは不要である。

    匿名メソッド

    匿名メソッドは、メソッドを呼び出すためにdelegateを定義したりメソッドを定義したりせず、直接呼び出したいメソッドを記述することで実行を可能にする。例としてボタンクリック時にメッセージボックスを表示するという処理を匿名メソッドで記述してみよう。

        button.Click += delegate { MessageBox.Show("Hello"); };

    このように、delegateの引数定義を省略した記述も可能である。呼び出すメソッドがほんの数行程度である場合、記述が大幅に簡素化される。

    Nullable type

    Ver1.1まではint型等の値型にはnullを代入することはできなかった。この点はデータベースとの連携などにおいて不便を感じるところであり、実際、.NET Frameworkの内部にはNullable Typeの実装がいくつもあったそうである。

    このNullable Typeを利用するためには、値型の定義時に"?"を型の後ろに記述する。

        int? x;

        x = null;
        x = 0;

    このように、xにはnullを代入することもint型が取り得る数値を代入することもできる。 また、Nullable Typeの導入に合わせて ?? オペレータが追加された。

        int i = x ?? 0;

    上記はNullable Typeであるxの値をint型のiに代入する際、xがnullであれば0をiに代入する、という式となる。

    イテレータ

    C#を利用している上で便利な制御構造にforeachがある。Ver1.1までは、foreachに対応したクラスを独自に実装するには複雑なコーディングを行う必要があった。この実装を単純化するためにイテレータが導入された。

        public class TestClass
        {
            public IEnumerator GetEnumerator()
            {
                yield return 1;
                yield return 2;
                yield return 3;
                yield return 4;
                yield return 5;
            }
        }

    このように実装すると、TestClassはforeachからの呼び出しにおいて1から5を順に返す。つまり、foreachから呼ばれたときにyeild returnが1度ずつ呼び出されているのである。実際にイテレータを実装する場合には、クラス内に配列等の形式でデータを保持し、その配列を順にyeild returnで返すような実装を記述することになる。

    なお、イテレータはクラス単位で実装できるだけでなく、メソッド単位で実装することも可能である。 下記はnumberPrintメソッドにイテレータを実装する例である。

    class TestProgram
    {
        static System.Collections.IEnumerable numberPrint(int max)
        {
            for (int i = 0; i <= max; i++)
                yield return i;
        }

        static void Main(string[] args)
        {
            foreach (int j in numberPrint(10))
                System.Console.WriteLine(j);
        }
    }

    パーシャル タイプ

    パーシャルタイプの導入により、1つのクラスを複数のファイルに分割して記述することが可能となった。これにより、ユーザインタフェースの定義の記述と制御コードの記述をファイルを分けて保存することができるようになった。

    Ver1.1までのASP.NETではこのユーザインタフェースと制御コードの分割(コードビハインド)を継承を用いることによって実現していた。これがVer2.0ではパーシャルタイプにより実現されることになる。 また、WindowsフォームではVer2.0ではじめてユーザインタフェースと制御コードの分割が行われるようになっている。

    C#2.0の強化点の特徴

    強化点の多くは、.NET Framework自体を作成している中でMicrosoft自身が必要であると感じた機能であるようだ。このため、これらの強化点により、最も恩恵を受けるのは独自にフレームワークを実装しているユーザではないだろうか。

    特にジェネリックスやイテレータはフレームワークを作成する場合に非常に魅力的な機能であると思われる。

    新着記事

    特設サイトの情報

      人気記事

      一覧

        イチオシ記事

        新着記事

        特別企画

        マイナビニュースマガジン