考虑以下示例。
假设我开发了一个第三方将使用的库。该库有一个接受的方法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
,或者我们是否应该在需要时允许并在安全上下文中枚举它,因为它可能会引发异常。