プロパティは実際には関数ですが、フィールドと同じように機能することが期待されています。任意の の期待されるパフォーマンスについて何が言えますIEnumerable
か?
プロパティから概念を借用して、IEnumerable
が配列または を反復するのとほぼ同じように実行する必要があると言うのは公平List<T>
ですか?
または、反復ごとに発生するほぼすべてのこと (データベース アクセス、Web サービスの呼び出し、時間のかかる計算など) に対しても大丈夫ですか?
プロパティは実際には関数ですが、フィールドと同じように機能することが期待されています。任意の の期待されるパフォーマンスについて何が言えますIEnumerable
か?
プロパティから概念を借用して、IEnumerable
が配列または を反復するのとほぼ同じように実行する必要があると言うのは公平List<T>
ですか?
または、反復ごとに発生するほぼすべてのこと (データベース アクセス、Web サービスの呼び出し、時間のかかる計算など) に対しても大丈夫ですか?
がどれだけうまく機能するかについての規則はないと思いIEnumerable<T>
ます-それがどのように振る舞うべきかについてだけです。つまり、コレクションをループする必要があります。
反復の開始時にデータベースにアクセスする必要がある場合(Entity FrameworkのようにIQueryable<T>
)、それは問題ありません。アイテムごとにDBまたはファイルを呼び出す必要がある場合は、問題ありません。私にとって唯一重要なことは、それをループできることです。
経験から言えば、任意の のパフォーマンスについて実際に推測することはできませんIEnumerable
。たとえば、IQueryable
変装して、列挙されるたびにデータベースにヒットする可能性があります。または、 の結果である可能性がありFile.EnumerateLines
ます。
列挙型を一度だけ列挙することが重要な場合があります。
これはプロパティとは対照的です。プロパティがデータベースにヒットしたり、ファイルを読み取ったりする場合、これはコードの匂いだと思います。IEnumerable
それは普通のことです。
IEnumerableにはプロパティがありませんが、ご存知のように、IEnumerableはIEnumeratorを返します。
オブジェクトがIEnumerable型のプロパティを公開している場合、それは一定時間で返されることが期待されますが、その列挙子の列挙にはおそらく期待がないはずです。
もちろん、状況は異なる場合があります。たとえば、WPFコントロールをその列挙可能なものにバインドしている場合、ユーザーはそれをすぐに返すことを望んでいます。
IEnumerable
もちろん、データベースにアクセスしたり、ファイルをクロールしたりするために使用できますが、そのようなものを公開する場合は、IEnumerable
それを明確に文書化する必要があります。
高価であることがすぐにわからない場合は、適切にカプセル化し、メモリ内の列挙のみを公開する必要があります。