![](/img/trans.png)
[英]I have a LINQ statement that is partially query and partially method. How can I do this using one or the other?
[英]Do I have to use a “using” statement in a short method?
我是否必须使用using
语句即使在方法中也要立即处置? 还是方法的结尾会导致自动Dispose
包括图形在内的所有局部变量? (之所以这么问,是因为我看过在方法末尾有Dispose
调用的示例,并且想知道这是否真的必要。)
谢谢。
是的你是。 超出范围不会做任何事情; 它不调用Dispose()
,不进行垃圾回收,不调用终结器。
如果类型是IDisposable
,则为yes 。 整理自己是您的工作(假设此时对象实际上已“完成”)。
不这样做的可能产生的副作用:
FileStream
) DbConnection
) 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.