2007年05月26日

GetEnumerator() vs. GetEnumerable() その2

  
コメントの文字数制限を越えてしまったので、新規記事としてアップします。

お二人のコメントで、foreach についてあやふやだったことが、だいぶ整理できてきました。Thanks! です。

foreachは、IEnumerableインターフェースを実装していることが前提だったと思ったのですが、IEnumerableを実装していなくても、GetEnumerator()メソッドを実装していれば、foreachを受け付けてくれるように変更されていたんですね。(それとも最初から?)

そのため、static メソッドでは、IEnumerableを返す必要がある。
いっぽう、インスタンスメソッドでは、IEnumerableを実装する、しないにかかわらず、GetEnumerator()を実装していさえすれば、

MyClass obj = new MyClass();
  foreach (object o in obj) {
...
}

と書ける。
ただ、逆順をたどるような反復子も用意したい場合には、GetEnumrator()という名前は使えないので、IEnumrator を返すメソッドを書いても、エラーになる。
IEnumerableを返すメソッドにしなければならない。

ってことですね。

http://msdn2.microsoft.com/ja-jp/library/9yb8xew9(VS.80).aspx

には、
----
インターフェイスを省略すると、Current の戻り値の型を object よりも明確に定義できるので、結果としてタイプ セーフになります。
----
と書いてあります。ふーん、そうなんだ。


この記事へのコメント
あー、このエントリを読んで、私の視点がずれてたことにやっと気付きました。
Gushwellさんとまじかんとさんは、1クラスに1列挙子の話をしてたんですね。
私は↓のような1つのstaticクラスにたくさんの列挙子があるものを考えてしまっていました。
http://msdn2.microsoft.com/ja-jp/library/system.linq.enumerable_members(VS.90).aspx

混乱を招いてしまってすみません。
ところでLINQ楽しいですよ(^^)
Posted by siokoshou at 2007年05月26日 18:39
siokoshou さん
staticクラスにたくさんの列挙子となれば、当然、GetEnumerableなんていう名前ではなく、もっと具体的な名前を付けることになりますね。
IEnumerableを返すのか、IEnumeratorを返すのかも、ケースバイケースで使い分けが必要そうです。
LINQは、一昨年のTechEDで聞いていらい何も情報を仕入れていないので、完全に忘却のかなたです...
そろそろ、勉強を始めないと...

Posted by Gushwell at 2007年05月27日 20:31
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/50804505
この記事へのトラックバック
それで、元々の「GetEnumerable を Google で日本語のページを検索すると、たった数件しかヒットしない。何でだろう?」という話ですが、上で gushwell さんが「IEnumerableを実装する、しないにかかわらず、GetEnumerator()を実装していさえすれば、(中略)と書ける。」と書...
Re: GetEnumerator() vs. GetEnumerable()【まじかんと雑記】at 2007年05月26日 14:04