<< Prev Page Next Page >>

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


C#のforeach

C#のforeach文は、イテレータを返せるクラス、またはイテレータを返せるクラスを返すメソッドならなんでも使える。

これすごい。 すごいんだけど、こわい。

 イテレータの実装が外部イテレータになってるのか、yieldを利用して実装されてるのか、全く区別されないので、メソッド利用者にとっては、元のインスタンスの内部状態がどうなってるのか、わからない。

IEnumerable<string> GetAll() {...}

という実装があったとして、
foreach (string element in GetAll()) {
    // 処理
}

処理のときに、GetAll()が終了しているのかしてないのかは(GetAll()の実装次第なので)わからない。

C#にdelegateがあるんだからRubyみたいにブロックをとるようになってるだけでいいのに。
GetAll(delegate(string element) {
    // 処理
});

ではだめだったんだろうか。これなら処理のときにGetAll()が終了してないことは一目瞭然。現状、こういうふうに書くこともできるんだけど、上のIEnumerableを返す書き方も出来ちゃうのが怖い。


この記事に対するコメント

この記事に対するコメントの投稿



管理者にだけ表示を許可する

この記事に対するトラックバック

トラックバックURL
http://tockri.blog78.fc2.com/tb.php/73-993f7046
この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。