繁体   English   中英

我是否必须在简短的方法中使用“ using”语句?

[英]Do I have to use a “using” statement in a short method?

我是否必须使用using语句即使在方法中也要立即处置? 还是方法的结尾会导致自动Dispose包括图形在内的所有局部变量? (之所以这么问,是因为我看过在方法末尾有Dispose调用的示例,并且想知道这是否真的必要。)

谢谢。

是的你是。 超出范围不会做任何事情; 它不调用Dispose() ,不进行垃圾回收,不调用终结器。

如果类型是IDisposable ,则为yes 整理自己是您的工作(假设此时对象实际上已“完成”)。

不这样做的可能产生的副作用:

  • 文件保持打开状态并导致访问异常( FileStream
  • 连接保持打开状态并导致池饱和( DbConnection
  • 非托管句柄变得饱和并导致资源匮乏(任何winforms / etc)
  • 事务保持打开状态并导致阻塞( TransactionScope / DbTransaction
  • 等等

基本上,坏事。

此外,在看到大多数情况下Dispose()在该方法的底部,一个using将是优选的。 有些情况下,这是不可能的(字段的对象上,例如),但该点保持:这听起来像那些坏榜样。

你永远不要处置的对象。 但是,如果您想提前释放非托管资源,而不是每当GC到来时(即它处理fReachable队列时)就释放非托管资源,那么您应该这样做,因为方法的范围无法确定何时调用一次性对象的finalize 。

有关更多信息,您可能需要阅读Jeffrey Richter的垃圾回收:Microsoft .NET Framework中的自动内存管理。

正如delnan指出的那样,如果您正在使用的资源受到严格限制,那么如果您让资源被GC回收而不是调用Dispose,则很有可能会受到影响。 数据库连接是这种资源的一个很好的例子,并且肯定是创建NumberOfReclaimedConnections性能计数器的原因。

是的,使用using 这是一个很好的声明。

实际上,如果不调用Dispose (手动或using ),您可能会遇到这样的情况,即托管内存仍然非常空,但非托管资源却被耗尽。 最终,它可能导致死锁,因为其他对象或其他进程将等待您的非托管资源,而您将等待它们。 (垃圾收集器将无法运行,因为托管内存仍然不会满。)

因此,请尽快致电Dispose 一旦不需要定义了该方法的对象,请调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM