using
声明_
using(var disposableObject = new object_that_implements_IDisposable()) { ... }
是类似于以下代码的语法糖:
var disposableObject = new object_that_implements_IDisposable()
try
{
...
}
finally
{
if(disposableObject != null)
{
((IDisposable)your_object).Dispose();
}
}
这仅适用于实现 IDisposable 的类。它有助于清理你有对象的代码,例如,系统资源(文件句柄、数据库连接、套接字等)在你完成后需要清理以释放资源以供其余部分使用系统。
理论上,您可以忽略.Dispose()
调用,但是您必须等待垃圾收集器释放保留的资源。GC 非常擅长知道何时释放对象以回收其内存使用量,但它不知道需要释放对象才能让它们放弃其他系统资源。因此,在 GC 决定它需要所有者使用的内存之前,这些关键资源可能不会被放弃。因此,您肯定希望在使用完对象后将其丢弃(如果它们是一次性的)!
至于为什么要使用using
over try
/ finally
,这纯粹是编码人员的偏好。我更喜欢using
,因为你可以级联它们:
using(var a = new class())
using(var b = new class())
using(var c = new class())
using(var d = new class())
{
...
}
您需要更多的代码行才能使用try
/来做到这一点finally
。
using
也有额外的优势。例如,虽然x.Dispose
直接调用可能会抛出一个NullReferenceException
ifx
为 null,using(x)
但不会。
也可以看看: