【发布时间】:2010-06-25 09:27:34
【问题描述】:
(这是对this问题答案的评论的后续)
在我发布它的 18 个月后,有人在 one of my Linq examples 中发现了一个错误,我在方法链的中途使用了 IDisposable,它永远不会被释放。
我试图写一个扩展方法来处理这个问题:
public static IEnumerable<R> Using<T, R>(
this IEnumerable<T> list, Func<T, R> selector) where R : IDisposable
{
foreach(var item in list)
using(var disposable = selector(item))
yield return disposable;
}
var q = Enumerable.Range(0, 10)
.Using(i => new Disposable(i))
.Select(d => d.Id);
在看到Marc's answer 到我上面提到的问题之后,我想知道是否可以直接重载 Select 扩展方法,但如果我这样做(通过将 Using 重命名为 Select),编译器会尖叫 Select(d => d.Id) ,因为There is no implicit conversion from 'string' to 'System.IDisposable'。
这是一个测试类...
public class Disposable : IDisposable
{
private string _id;
private bool _disposed = false;
public Disposable(int id)
{
Id = id.ToString();
Console.WriteLine("Creating " + Id);
}
public void Dispose()
{
Console.WriteLine("Disposing " + Id);
_disposed = true;
}
public string Id
{
get
{
if(_disposed) throw new Exception("Call to disposed object!");
return _id;
}
set { _id = value; }
}
}
【问题讨论】:
标签: linq extension-methods idisposable