Using
C#中块的目的是什么?它与局部变量有何不同?
9 回答
如果该类型实现 IDisposable,它会自动释放该类型。
鉴于:
public class SomeDisposableType : IDisposable
{
...implmentation details...
}
这些是等价的:
SomeDisposableType t = new SomeDisposableType();
try {
OperateOnType(t);
}
finally {
if (t != null) {
((IDisposable)t).Dispose();
}
}
using (SomeDisposableType u = new SomeDisposableType()) {
OperateOnType(u);
}
第二个更容易阅读和维护。
从 C# 8 开始,有一种新的语法using
可以使代码更具可读性:
using var x = new SomeDisposableType();
它没有自己的{ }
块,使用的范围是从声明点到声明它的块的末尾。这意味着您可以避免以下内容:
string x = null;
using(var someReader = ...)
{
x = someReader.Read();
}
并有这个:
using var someReader = ...;
string x = someReader.Read();
Using
Dispose()
在 -block 离开后调用using
,即使代码抛出异常。
因此,您通常using
用于需要在它们之后进行清理的类,例如 IO。
所以,这个 using 块:
using (MyClass mine = new MyClass())
{
mine.Action();
}
会做同样的事情:
MyClass mine = new MyClass();
try
{
mine.Action();
}
finally
{
if (mine != null)
mine.Dispose();
}
使用using
方式更短,更易于阅读。
来自 MSDN:
C# 通过 .NET Framework 公共语言运行时 (CLR) 自动释放用于存储不再需要的对象的内存。内存的释放是不确定的;每当 CLR 决定执行垃圾回收时,就会释放内存。但是,通常最好尽快释放文件句柄和网络连接等有限资源。
using 语句允许程序员指定使用资源的对象何时应该释放它们。提供给 using 语句的对象必须实现 IDisposable 接口。该接口提供了 Dispose 方法,该方法应该释放对象的资源。
换句话说,该using
语句告诉 .NET 在using
不再需要块中指定的对象时释放它。
using 语句用于处理 C# 中实现IDisposable
接口的对象。
该IDisposable
接口有一个称为Dispose
用于处置对象的公共方法。当我们使用 using 语句时,我们不需要在代码中显式地处理对象,using 语句会处理它。
using (SqlConnection conn = new SqlConnection())
{
}
当我们使用上面的块时,内部代码是这样生成的:
SqlConnection conn = new SqlConnection()
try
{
}
finally
{
// calls the dispose method of the conn object
}
有关更多详细信息,请阅读:了解 C# 中的“使用”语句。
using (B a = new B())
{
DoSomethingWith(a);
}
相当于
B a = new B();
try
{
DoSomethingWith(a);
}
finally
{
((IDisposable)a).Dispose();
}
另请注意,通过实例化的对象using
在 using 块中是只读的。请参阅此处的官方 C# 参考。
将代码放在 using 块中可确保在控制离开该块时立即释放对象(尽管不一定要收集)。
它实际上只是一些语法糖,不需要您对实现 IDisposable 的成员显式调用 Dispose。
using 语句获取一个或多个资源,执行一个语句,然后释放该资源。