我可以使用using var
:
await foreach (var response in _container.GetItemQueryStreamIterator(query))
{
using var safeResponse = response;
//use the safeResponse
}
还是我应该这样做:
await foreach (var response in _container.GetItemQueryStreamIterator(query))
{
try {
//use response
} finally {
response?.Dispose();
}
}
还是我可以不做任何IAsyncDisposable
await foreach
事情,因为迭代器是an,而will为我做呢?
await foreach (var response in _container.GetItemQueryStreamIterator(query))
{
//use the response
}
给定一个IEnumerable<IDisposable>
(包含或不包含Async
)元素,没有规则规定谁应该处理这些元素。因此,(并希望)枚举不会处理它的元素。
处置这些元素是您的责任。
在您的问题中,要处置它们将反复进行,因此选项3是不可能的,您必须自己处置它们。
选项1和2是等效的,但都很臭。
您可以写:
await foreach (var item in enumerable)
{
await using (item)
{
..
}
}
// by playing with your autoformatter
await foreach (var item in enumerable) await using (item)
{
..
}
可悲的是,我没有找到更好的解决方案。而且,如果您使用ValueType ,似乎必须要小心。也许我们应该问这样的事情:
await foreach(await using var e in c)
当然编辑已经有人要了。
谢谢您将使用您的自动格式化建议:)