C#中使用块的目的是什么?它与局部变量有什么不同?
答案 0 :(得分:286)
如果类型实现了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);
}
第二种更容易阅读和维护。
答案 1 :(得分:96)
Using
- 块之后, Dispose()
调用using
,即使代码抛出异常。
因此,您通常会将using
用于需要清理的类,例如IO。
所以,这个使用块:
using (MyClass mine = new MyClass())
{
mine.Action();
}
会做同样的事情:
MyClass mine = new MyClass();
try
{
mine.Action();
}
finally
{
if (mine != null)
mine.Dispose();
}
使用using
更短更容易阅读。
答案 2 :(得分:39)
来自MSDN:
C#,通过.NET Framework常见 语言运行时(CLR),自动 释放用于存储的内存 不再需要的对象。 内存的释放是 非确定性;内存被释放 每当CLR决定执行时 垃圾收集。但是,确实如此 通常最好释放有限 文件句柄和文件等资源 网络连接速度快 可能。
using语句允许 程序员指定何时对象 使用资源应该发布 他们。提供给使用的对象 声明必须执行 IDisposable接口。这个界面 提供Dispose方法,其中 应释放对象的资源。
换句话说,using
语句告诉.NET在不再需要时释放using
块中指定的对象。
答案 3 :(得分:22)
using语句用于处理实现IDisposable
接口的C#中的对象。
IDisposable
接口有一个名为Dispose
的公共方法,用于处理对象。当我们使用using语句时,我们不需要在代码中显式地处理对象,using语句会处理它。
using (SqlConnection conn = new SqlConnection())
{
}
当我们使用上面的块时,内部代码生成如下:
SqlConnection conn = new SqlConnection()
try
{
}
finally
{
// calls the dispose method of the conn object
}
答案 4 :(得分:5)
将代码放置在使用块中可确保在控件离开块时尽快处理对象(但不一定要收集)。
答案 5 :(得分:5)
using (B a = new B())
{
DoSomethingWith(a);
}
相当于
B a = new B();
try
{
DoSomethingWith(a);
}
finally
{
((IDisposable)a).Dispose();
}
答案 6 :(得分:5)
另请注意,通过using
实例化的对象在using块中是只读的。请参阅官方C#参考here。
答案 7 :(得分:2)
实际上只是一些语法糖不要求你在实现IDisposable的成员上显式调用Dispose。
答案 8 :(得分:2)
using语句获取一个或多个资源,执行语句,然后处置资源。