【发布时间】:2021-12-14 18:18:53
【问题描述】:
我正在寻找如何处理这种情况的最佳做法/标准。
我们的代码 (MyClass) 使用另一个类 (ItemGenerator)。 ItemGenerator 对我们来说是一个黑盒,所以我们不知道实现(我们知道,但我们不想依赖它,因为它可能会从下面改变)。
ItemGenerator 有一个方法 GetItems(),它返回 Item 的 IEnumerable。 Item 类实现了 IDisposable,因此我们应该在完成后处理该对象。
当我们(MyClass)遍历项目列表时,如果发生异常(任何异常),我们要停止处理并释放控制权(冒泡异常)。
我的问题是:
我们是否应该继续遍历这些项目以处理所有项目?这可能看起来很愚蠢,但如果其他物品不被处理掉怎么办?
同时,基于下面的代码,我们绝对不应该遍历其余的项目,因为它们是yield return。那么为什么要生成它们以便我们可以处理它们(这可能会显着影响性能)。
问题是我们不知道 GetItems() 是否按需返回项目(产量)。而且我认为我们不应该关心,对吧?
那么当列表中间出现异常(例如)时,我们应该如何处理呢?
以下是说明其要点的代码示例。
这是我们的代码:
public class MyClass
{
public void VerifyAllItems()
{
ItemGenerator generator = new ItemGenerator();
foreach (Item item in generator.GetItems())
{
try
{
// Do some work with "item" here. Though an exception could occur.
// If an exception occurs, we don't care about processing the rest of the items and just want to bubble up the exception
}
finally
{
// Always dispose of the
item?.Dispose();
}
}
}
}
这是黑盒代码
public class ItemGenerator
{
private long _itemsToGenerate = 0;
public ItemGenerator()
{
_itemsToGenerate = new Random().Next(10, 100);
}
public IEnumerable<Item> GetItems()
{
while (_itemsToGenerate > 0)
{
yield return HeavyWork();
_itemsToGenerate--;
}
}
private Item HeavyWork()
{
// Doing a lot of work here
return new Item();
}
}
public class Item : IDisposable
{
private bool _isDisposed = false;
public virtual void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool isDisposing)
{
if (!_isDisposed)
{
if (isDisposing)
{
// Dispose of any resources
}
_isDisposed = true;
}
}
}
【问题讨论】:
-
你想多了。如果提供者需要您在遗弃方面做额外的工作,那它就坏了。如果没有,那么什么都不做是正确的。
标签: c# yield idisposable