|
|
連載:[完全版]究極のC#プログラミング
Chapter3 新しい繰り返しのスタイル ― yield return文とForEachメソッド
川俣 晶
2009/08/31 |
|
|
3.3 C# 1.xによるRangeクラスの実装
まず、C# 1.xでRangeクラスを作成してみよう(リスト3.1参照。実際にはVisual Studio 2008でC# 2.0/3.0の機能を使わないで記述し、動作を確認している)。一応、正攻法で記述してみたのでかなり冗長になっている(列挙関係のインターフェースを明示的に実装すれば、もっと文字数は増える)。
using System;
class RangeEnum
{
private int current, to;
public bool MoveNext()
{
current++;
return current <= to;
}
public int Current
{
get { return current; }
}
public RangeEnum(int from, int to)
{
current = from - 1;
this.to = to;
}
}
class Range
{
private int from, to;
public RangeEnum GetEnumerator()
{
return new RangeEnum(from, to);
}
public Range(int from, int to)
{
this.from = from;
this.to = to;
}
}
class Program
{
static void Main(string[] args)
{
foreach (int i in new Range(0, 9))
{
Console.Write("{0} ", i);
}
// 出力:0 1 2 3 4 5 6 7 8 9
}
}
|
|
リスト3.1 C# 1.xによるRangeクラスの実装 |
このコードで目立つ“うっとうしい”部分は次の2つだろう。
- Rangeクラスのほかにもう1つRangeEnumクラスがあり、クラスを2つも書くのはうっとうしい
- 列挙するためにMoveNextメソッド、Currentプロパティ、状態を記憶しておくフィールドcurrent、終了条件を保存しておくフィールドtoとたくさんのものを書くのはうっとうしい
このうっとうしさが、列挙可能なオブジェクトを自作するうっとうしさそのものといえる。
Insider.NET 記事ランキング
本日
月間