返回列表 回复 发帖

Using 语句的作用

有时,代码要求非托管资源,如文件句柄、COM 包装或 SQL 连接。在使用一个或多个此类资源完成了代码后,Using 块确保这些资源的释放。这样,其他代码就可以使用它们。
托管资源由 .NET Framework 垃圾回收器 (GC) 释放,您不需要进行任何额外的编码。您也不需要用于托管资源的 Using 块。
Using 块有三个部分:获取、使用和释放。
  • 获取表示创建变量并将其初始化,以便引用系统资源。Using 语句可获取一个或多个资源,您可以在进入块之前恰好获取一个资源,并将其提供给 Using 语句。如果提供 resourceexpression,在将控制权传递给 Using 语句之前,您必须获取资源。
  • 使用表示访问资源并使用资源执行操作。UsingEnd Using 之间的语句代表资源的使用过程。
  • 释放表示针对 resourcename 中的对象调用 Dispose 方法。这使该对象可以完全终止其非托管资源。End Using 语句释放 Using 块控制的资源。
行为Using 块的工作方式类似于 Try...Finally 构造,在该构造中,Try 块使用资源,而 Finally 块释放资源。因此,不管您如何退出块,Using 块都可确保资源的释放。即使发生未处理的异常(除 StackOverflowException 外),也是如此。
Using 语句获取的每个资源变量的范围仅限于 Using 块。
如果在 Using 语句中指定多个系统资源,效果就好像您将多个 Using 块相互嵌套一样。

Using 块中的结构化异常处理如果需要处理可能发生在 Using 块中的异常,可以向该块中添加一个完整的 Try...Finally 构造。如果需要处理 Using 语句未成功获取资源的情况,可以进行测试,以确定 resourcename 是否为 Nothing

进行结构化异常处理而不使用 Using 块如果需要对资源的获取进行更细致的控制,或者需要 Finally 块中的附加代码,可以将 Using 块重写为 Try...Finally 构造。下面的示例显示主干 TryUsing 构造,这两个构造在获取和释放 resource 过程中是等效的。
  1. Using resource As New resourceType
  2. ' Insert code to work with resource.
  3. End Using
  4. ' THE FOLLOWING TRY CONSTRUCTION IS EQUIVALENT TO THE USING BLOCK
  5. Dim resource As New resourceType
  6. Try
  7. ' Insert code to work with resource.
  8. Catch ex As Exception
  9. ' Insert code to process exception.
  10. Finally
  11. ' Insert code to do additional processing before disposing of resource.
  12. resource.Dispose()End Try
复制代码
注意
Using 块内部的代码不应将 resourcename 中的对象赋给其他变量。当您退出 Using 块时,资源将被释放,于是其他变量将无法访问它所指向的资源。




示例
下面的示例使用 Using 块来获取一个新字体。这样可确保代码退出该块时,系统将对该字体调用 Dispose 方法。
Visual Basic
  1. Public Sub setbigbold(ByVal c As Control)
  2. Using nf As New System.Drawing.Font("Arial", 12.0F, _
  3. System.Drawing.FontStyle.Bold)

  4. c.Font = nf
  5. c.Text = "This is 12-point Arial bold"
  6. End Using
  7. End Sub
复制代码

using(C# 参考)

using 关键字有两个主要用途:

作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。请参见 using 指令。

作为语句,用于定义一个范围,在此范围的末尾将释放对象。请参见 using 语句。

定义一个范围,将在此范围之外释放一个或多个对象。
语法
  1. using (Font font1 = new Font("Arial", 10.0f))
  2. {
  3. }
复制代码
备注
C# 通过 .NET Framework 公共语言运行库 (CLR) 自动释放用于存储不再需要的对象的内存。内存的释放具有不确定性;一旦 CLR 决定执行垃圾回收,就会释放内存。但是,通常最好尽快释放诸如文件句柄和网络连接这样的有限资源。
using 语句允许程序员指定使用资源的对象应当何时释放资源。为 using 语句提供的对象必须实现 IDisposable 接口。此接口提供了 Dispose 方法,该方法将释放此对象的资源。
可以在到达 using 语句的末尾时,或者在该语句结束之前引发了异常并且控制权离开语句块时,退出 using 语句。
可以在 using 语句中声明对象(如上所示),或者在 using 语句之前声明对象,如下所示:
  1. Font font2 = new Font("Arial", 10.0f);
  2. using (font2)
  3. {
  4. // use font2
  5. }
复制代码
可以有多个对象与 using 语句一起使用,但是必须在 using 语句内部声明这些对象,如下所示:
  1. using (Font font3 = new Font("Arial", 10.0f),
  2. font4 = new Font("Arial", 10.0f))
  3. {
  4. // Use font3 and font4.
  5. }
复制代码
示例

下面的示例显示用户定义类可以如何实现它自己的 Dispose 行为。注意类型必须从 IDisposable 继承。
  1. using System;

  2. class C : IDisposable
  3. {
  4. public void UseLimitedResource()
  5. {
  6. Console.WriteLine("Using limited resource...");
  7. }

  8. void IDisposable.Dispose()
  9. {
  10. Console.WriteLine("Disposing limited resource.");
  11. }
  12. }

  13. class Program
  14. {
  15. static void Main()
  16. {
  17. using (C c = new C())
  18. {
  19. c.UseLimitedResource();
  20. }
  21. Console.WriteLine("Now outside using statement.");
  22. Console.ReadLine();
  23. }
  24. }
复制代码
返回列表