2009-04-15 100 views
6

真的希望能够用某种强制使用using语句的属性来装饰我的类,以便该类将始终安全地处理并避免内存泄漏。任何人都知道这样的技术?是否有可能在C#中强制使用using语句?

+0

怎么样在不同的一次性对象嵌入你的对象? – 2009-04-15 10:10:20

+0

使用IDisposable装饰您的课堂是为了让您的课程消费者拥有应该包装在使用中或称为Dispose的标志。如果您强制执行“使用”技术,则可以有效地向您的好消费者说:“我认为您太胖了,无法调用Dispose”,并限制使用量。 – 2009-04-15 10:37:33

+0

我也想说,你确定有没有情况下有人可能想用一种方法创建你的对象,并在另一个方法中处理它? (也许他们也是IDisposable)。你让别人无法做到这一点。 – 2009-04-15 10:38:57

回答

13

那么,有一种方法可以做到这一点 - 只允许通过采用委托的静态方法访问您的对象。作为一个非常简单的例子(如明明有打开文件的许多不同的方式 - 读/写等):

public static void WorkWithFile(string filename, Action<FileStream> action) 
{ 
    using (FileStream stream = File.OpenRead(filename)) 
    { 
     action(stream); 
    } 
} 

如果能够创建自己可支配的对象实例的唯一的事情是在您自己的方法类,你可以确保它们得到适当的使用。诚然,没有什么可以阻止委托人获取参考文献的副本,并在稍后尝试使用它,但这不是完全相同的问题。

这种技术严重限制了你可以用你的对象做什么 - 当然 - 但在某些情况下它可能是有用的。

0

如果要确保始终处理对象,请将终结器与IDisposable组合使用。

但在此之前,请阅读IDisposable和终结器,并意识到通常不需要它们的事实,除非您的类正在管理非托管资源的生命周期。

使用终结器,无论是否包含使用,您的对象都将被“最终”回收。 use语句是IDisposable的一种方便,它允许进行确定性清理。唯一需要注意的是,使用终结器的对象清理起来会更昂贵,而且一般会在等待最终定稿时更长时间地记忆在记忆中。

裁判When do I need to implement a finalizer or IDisposable?technorabble: Using Dispose, Finalizers and IDisposable