例如,如果我有这个方法:
IEnumerable<int> GetRandomNumbers()
{
// {Codes that generate numbers as List<int>}
if(generationFails == true)
{
return Enumberable.Empty<int>(); // I do this to signal that we have an error
}
return numbers;
}
Run Code Online (Sandbox Code Playgroud)
在调用方法中我做:
IEnumerable<int> AddNumber(int number)
{
var random = GetRandomNumbers();
var randomList = random as IList<int> ?? random.ToList(); // Run ToList only if needed
randomList.Add(number);
return randomList;
}
Run Code Online (Sandbox Code Playgroud)
当生成失败时,我得到一个异常"[NotSupportedException:Collection是固定大小的.]".
这是因为Enumerable empty是一个IList,因此.ToList()没有运行,然后我尝试添加到一个固定的Enumberable.Empty.我错误地认为这是一个糟糕的设计,一个继承IList的对象(其中定义了Add)应该支持Add?
我被迫做var randomList = random.ToList()或停止使用Enumberable.Empty?有更好的方法吗?
更新: 我想在我的例子中我不清楚.我希望吞下(或记录)错误,但允许操作继续而不会崩溃.我的评论"我这样做是为了表明我们有错误"是为了告诉其他开发人员阅读代码,这是一种异常行为.
蒂姆所关联的问题的答案就是我所得到的.似乎我们只是没有用于常量集合的接口,因此IList被使用.
更好的方法是返回null或抛出异常.返回空列表可以被认为是有效的替代,但不是在您的方法的上下文中(例如,过滤另一个没有有效项目的列表).
失败的随机数生成似乎表明生成算法存在问题,应该抛出异常,而不是空列表.
检索方法是否应返回'null'或在无法生成返回值时抛出异常?
如果您总是希望找到一个值,则抛出异常(如果缺少).例外意味着存在问题.
如果该值可能丢失或存在且两者都对应用程序逻辑有效,则返回null.