考慮下面的例子。設計公共API時我們應該避免IEnumerable作爲輸入嗎?
假設我開發了一個將由第三方使用的庫。該庫有一個方法,接受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
,或者我們是否應該在需要時允許並枚舉安全上下文,因爲它可能會引發異常。
好,不過我可能需要做一些清理工作(如關閉數據庫連接),所以我想知道有什麼可以拋出異常 – nan 2012-07-19 18:53:33
@nan:一'using'塊是處理這種情況的標準方法。正確使用它將確保任何異常都會導致您的連接關閉。 – Guvante 2012-07-19 18:56:01
它不僅僅是處理它的事實,我需要恢復一些異常狀態,我需要了解它們。 – nan 2012-07-19 18:58:32