次の例を検討してください。
サードパーティが使用するライブラリを開発したとします。ライブラリには を受け入れるメソッドがありますIEnumerable
。これは、渡されたコレクションの実装から抽象化されるため、優れています。ただし、入力パラメーターを取得すると、遅延評価が発生します。
public interface IStorage<in T>
{
void Store(IEnumerable<T> values);
}
public class FileStorage<T> : IStorage<T>
{
public void Store(IEnumerable<T> values)
{
foreach (var value in values) { /*Evaluation of IEnumerable*/}
}
}
一部のクライアントは、私のライブラリを次のように使用しています。
IEnumerable<int> values;
try
{
values = new[] { "1", "2", "three" }.Select(int.Parse);
}
catch (Exception)
{
values = Enumerable.Empty<int>();
}
var storage = new FileStorage<int>();
storage.Store(values);
Store
これにより、評価が行われるメソッド内で例外が発生します。Store
取るメソッドを設計した場合List<T>
、それが安全に列挙可能な Ts のコレクションであると確信できます。問題は、API を設計するときに避けるべきIEnumerable
か、例外を発生させる可能性があるため、必要に応じて安全なコンテキストで API を許可して列挙する必要があるかどうかです。