我一直被using
开发人员记住要做的事实所困扰 - 充其量你会收到一个警告,大多数人从不费心将其提升为错误。所以,我一直在玩弄这样的想法——它迫使客户至少尝试正确地做事。幸运和不幸的是,它是一个闭包,所以客户端仍然可以保留资源的副本,并在以后尝试再次使用它 - 但这段代码至少试图将客户端推向正确的方向......
public class MyLockedResource : IDisposable
{
private MyLockedResource()
{
Console.WriteLine("initialize");
}
public void Dispose()
{
Console.WriteLine("dispose");
}
public delegate void RAII(MyLockedResource resource);
static public void Use(RAII raii)
{
using (MyLockedResource resource = new MyLockedResource())
{
raii(resource);
}
}
public void test()
{
Console.WriteLine("test");
}
}
很好的用法:
MyLockedResource.Use(delegate(MyLockedResource resource)
{
resource.test();
});
使用不当!(不幸的是,这是无法避免的......)
MyLockedResource res = null;
MyLockedResource.Use(delegate(MyLockedResource resource)
{
resource.test();
res = resource;
res.test();
});
res.test();