だいぶサボってました・・・(^ ^;
たまには別の話題もというコトで今更 C# 3.0 の備忘録でも。。。
遊びでC#をいぢるコトがあるけど今までは前に覚えた文法そのまま使ってました。
Visual Studio 2008 だと C# も 3.0 が使えるので改めてお勉強してみると結構便利。
以下は某一家の成人男性名を表示する無意味なソースです。(笑)
今までだとこんな風に書いてました。(C# 2.0 ?)
private enum PersonSex { Male, Female } private class Person { public Person(string name, int age, PersonSex sex) { m_Name = name; m_Age = age; m_Sex = sex; } private string m_Name; private int m_Age; private PersonSex m_Sex; public string Name { get { return m_Name; } } public int Age { get { return m_Age; } } public PersonSex Sex { get { return m_Sex; } } } private void button1_Click(object sender, EventArgs e) { List<Person> persons = new List<Person>(); persons.Add(new Person("Namihei", 54, PersonSex.Male)); persons.Add(new Person("Fune", 52, PersonSex.Female)); persons.Add(new Person("Sazae", 24, PersonSex.Female)); persons.Add(new Person("Masuo", 25, PersonSex.Male)); persons.Add(new Person("Katsuo", 11, PersonSex.Male)); persons.Add(new Person("Wakame", 9, PersonSex.Female)); persons.Add(new Person("Tarao", 3, PersonSex.Male)); foreach (Person person in persons .FindAll(delegate(Person _p) { return _p.Age >= 20; }) .FindAll(delegate(Person _p) { return _p.Sex == PersonSex.Male; })) { MessageBox.Show(person.Name); } }
これを C# 3.0 的に書くとこんな感じ?
private enum PersonSex { Male, Female } private class Person { public Person(string name, int age, PersonSex sex) { this.Name = name; this.Age = age; this.Sex = sex; } public string Name { get; private set; } public int Age { get; private set; } public PersonSex Sex { get; private set; } } private void button1_Click(object sender, EventArgs e) { var persons = new List<Person>() { new Person("Namihei", 54, PersonSex.Male), new Person("Fune", 52, PersonSex.Female), new Person("Sazae", 24, PersonSex.Female), new Person("Masuo", 25, PersonSex.Male), new Person("Katsuo", 11, PersonSex.Male), new Person("Wakame", 9, PersonSex.Female), new Person("Tarao", 3, PersonSex.Male) }; foreach (var person in persons .FindAll((_p) => _p.Age >= 20) .FindAll((_p) => _p.Sex == PersonSex.Male)) { MessageBox.Show(person.Name); } }
個人的には自動実装プロパティ&getアクセサとsetアクセサに対して別のアクセシビリティを指定するあたりが素敵w
public string Name { get; private set; }
クラスの中からアクセスするには this.Name みたいにすればOKだし。
this.Name = name;
それと慣れるとクセになりそうなのがラムダ式かな。
ジェネリックのFindAllメソッドのPredicate<T>デリゲートを使う場合なんかでも、
匿名メソッドと比べるとコードも少なくて良いw
.FindAll(delegate(Person _p) { return _p.Age >= 20; })
これが
.FindAll((_p) => _p.Age >= 20)
こうなる。
逆に便利だとは思うけど個人的に使わなそうなのが var を使った暗黙的型指定とコレクション初期化子。
var は冗長性を回避する点では凄くいい。でも型がわからない場合は使えないので
var persons;
こういう書き方はできない。
場合によっては初期化しないで変数を宣言したい時もあるので、var を使った宣言と型を指定した宣言が混在するのは少し気持ちが悪いなぁと。まあ遊びでヤルぶんには問題ないけど、仕事だとコメント書くのを義務づけられてたりして、そっちの方が冗長性に難があったりするしw
コレクション初期化子は実際にコレクションの内容を直接コードに記入するコトがあまり無い気がするw
var persons = new List<Person>() { new Person("Namihei", 54, PersonSex.Male), new Person("Fune", 52, PersonSex.Female),
ちなみに Visual Studio 2008 であれば.NET Framework 2.0 の場合でも C# 3.0 でコードを書ける模様。
.NET Framework 3.5 の機能である LINQ などを使わなければいいってことね。
でも、こうしてみるとC#も面白いかも。廃れないことを祈る。