Visual Studio 2008 C#で開発効率アップ!

第4回 C#3.0の生産力と仕組み

この記事を読むのに必要な時間:およそ 5 分

はじめに

前回までで,C#3.0の主な新機能については,一通りご説明してきました。 今回は,C#3.0の新機能を使って記述したサンプルコードをC#2.0でもご紹介してみます。 これによって,C#3.0の生産力を実際にご確認ください。

コード比較で理解するC#3.0の生産力

最初に,タイトルを除いてまったく同じ動作をしていることを示す,以下の二つの画面イメージを確認してみてください。 Form3,Form2という二つのフォームのそれぞれにlistBoxというリストボックスが配置されています。

C#3.0のコードで作成した結果の画面

C#3.0のコードで作成した結果の画面

C#2.0のコードで作成した結果の画面

C#2.0のコードで作成した結果の画面

どちらもリストボックスのアイテムをクリックすることで,その名前の番号をメッセージボックスに表示します。

画像

行っていることは,次の通りです。

  • 番号・名前・年齢プロパティを持つオブジェクトの作成
  • 各オブジェクトをアイテムとしたコレクションオブジェクトの作成
  • 番号・名前プロパティを持つオブジェクトのデータソースに作り変え
  • 同時に,未成年情報だけを抽出して名前順に並べ替え

Form3,Form2という二つのフォームの画面イメージとサンプルコードです。

C#3.0

using System.Linq;
using System.Windows.Forms;
namespace WindowsFormsApplication1 {
    public partial class Form3 : Form {
        public Form3() {
            InitializeComponent();

            var c = new[] {
                new { Code = 1, Name = "Tanaka" , Age = 18 },
                new { Code = 2, Name = "Suzuki" , Age = 32 },
                new { Code = 3, Name = "Sato"   , Age = 19 },
                new { Code = 4, Name = "Yamada" , Age = 12 },
                new { Code = 5, Name = "Aoyama" , Age = 21 }
            };

            var q = 
                from x in c 
                where x.Age < 20
                orderby x.Name
                select new { Code = x.Code, Name = x.Name };

            listBox.DataSource = q.ToArray();
            listBox.ValueMember = "Code";
            listBox.DisplayMember = "Name";
            listBox.SelectedValueChanged += (sender, e) => {
                this.Value = listBox.SelectedValue;
                MessageBox.Show(this.Value.ToString()); };
        }

        public object Value { get; private set; }
    }
}

C#2.0

using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace WindowsFormsApplication1 {
    public partial class Form2 : Form {
        public Form2() {
            InitializeComponent();

            Member tanaka = new Member();
            tanaka.Code = 1;
            tanaka.Name = "Tanaka";
            tanaka.Age = 18;

            Member suzuki = new Member();
            suzuki.Code = 2;
            suzuki.Name = "Suzuki";
            suzuki.Age = 32;

            Member sato = new Member();
            sato.Code = 3;
            sato.Name = "Sato";
            sato.Age = 19;

            Member yamada = new Member();
            yamada.Code = 4;
            yamada.Name = "Yamada";
            yamada.Age = 12;

            Member aoyama = new Member();
            aoyama.Code = 5;
            aoyama.Name = "Aoyama";
            aoyama.Age = 21;

            Member[] c = new Member[] {
                tanaka, suzuki, sato, yamada, aoyama };

            List<Item> list = new List<Item>();
            foreach (Member x in c) {
                if (x.Age < 20) {
                    Item item = new Item();
                    item.Code = x.Code;
                    item.Name = x.Name;
                    list.Add(item);
                }
            }
            list.Sort(
                delegate(Item a, Item b) {
                    return string.Compare(a.Name, b.Name); });

            listBox.DataSource = list;
            listBox.ValueMember = "Code";
            listBox.DisplayMember = "Name";

            listBox.SelectedValueChanged += 
                delegate(object sender, EventArgs e) {
                    this.Value = this.listBox.SelectedValue;
                    MessageBox.Show(this.Value.ToString()); };
        }

        private object _Value;
        public object Value {
            get { return this._Value; }
            private set { this._Value = value; }
        }
    }

    public class Item {
        private int _Code;
        public int Code {
            get { return this._Code; }
            set { this._Code = value; }
        }

        private string _Name;
        public string Name {
            get { return this._Name; }
            set { this._Name = value; }
        }
    }

    public class Member {
        private int _Code;
        public int Code {
            get { return this._Code; }
            set { this._Code = value; }
        }

        private string _Name;
        public string Name {
            get { return this._Name; }
            set { this._Name = value; }
        }

        private int _Age;
        public int Age { 
            get { return this._Age; }
            set { this._Age = value; }
        }
    }
}

もちろん,どちらも同じ処理をするコードです。 どちらが生産性が高いのかについては,言うまでもないでしょう。

著者プロフィール

伊藤達也(いとうたつや)

Microsoft MVP for Visual C#(April 2007 - March 2009)

自他共に認めるC#信者です。

(株)井沢電器設備(ビットラン)にて,主に業務管理システムの設計・開発を行っています。開発に関するご依頼ご相談など常時受け付けております。お気軽にご連絡ください。

Mailito@bitlan.net

コメント

コメントの記入