💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# using 语句(C# 参考) 提供能确保正确使用 [IDisposable](https://msdn.microsoft.com/zh-cn/library/system.idisposable.aspx) 对象的方便语法。 下面的示例演示如何使用 using 语句。 ``` using (Font font1 = new Font("Arial", 10.0f)) { byte charset = font1.GdiCharSet; } ``` ## 备注 [File](https://msdn.microsoft.com/zh-cn/library/system.io.file.aspx) 和 [Font](https://msdn.microsoft.com/zh-cn/library/system.drawing.font.aspx) 是访问非托管资源(本例中为文件句柄和设备上下文)的托管类型的示例。有许多其他类别的非托管资源和封装这些资源的类库类型。所有这些类型都必须实现 [IDisposable](https://msdn.microsoft.com/zh-cn/library/system.idisposable.aspx) 接口。 按照规则,当使用 **IDisposable** 对象时,应在 **using** 语句中声明和实例化此对象。 using 语句按照正确的方式调用对象上的 [Dispose](https://msdn.microsoft.com/zh-cn/library/system.idisposable.dispose.aspx) 方法,并(在您按照前面所示方式使用它时)会导致在调用 [Dispose](https://msdn.microsoft.com/zh-cn/library/system.idisposable.dispose.aspx) 时对象自身离开作用域。 在 using 块中,对象是只读的并且无法修改或重新赋值。 using 语句确保即使在调用对象上的方法时发生异常[Dispose](https://msdn.microsoft.com/zh-cn/library/system.idisposable.dispose.aspx)方法也会被调用。 可通过将对象放入 try 块中并在finally 块中调用[Dispose](https://msdn.microsoft.com/zh-cn/library/system.idisposable.dispose.aspx)来达到同样的结果;实际上,这就是编译器转换 using 语句的方式。 前面的代码示例在编译时将扩展为以下代码(请注意,使用额外的大括号为对象创建限制范围): ``` { Font font1 = new Font("Arial", 10.0f); try { byte charset = font1.GdiCharSet; } finally { if (font1 != null) ((IDisposable)font1).Dispose(); } } ``` 如下面的示例所示,可以在 **using** 语句中声明一个类型的多个实例。 ``` using (Font font3 = new Font("Arial", 10.0f), font4 = new Font("Arial", 10.0f)) { // Use font3 and font4. } ``` 可以实例化资源对象,然后将变量传递给 **using** 语句,但这不是最佳做法。在这种情况下,该对象将在控制权离开 **using** 块之后保持在范围内,即使它可能将不再具有对其非托管资源的访问权也是如此。 换句话说,它将不再是完全初始化的。 如果尝试在 **using** 块外部使用该对象,则可能导致引发异常。 由于这个原因,通常最好是在 using 语句中实例化该对象并将其作用域限制到using块中。 ``` Font font2 = new Font("Arial", 10.0f); using (font2) // not recommended { // use font2 } // font2 is still in scope // but the method call throws an exception float f = font2.GetHeight(); ``` ## C# 语言规范 有关详细信息,请参阅 [C# 语言规范](https://msdn.microsoft.com/zh-cn/library/ms228593.aspx)。该语言规范是 C# 语法和用法的权威资料。 ## 请参阅 [C# 参考](https://msdn.microsoft.com/zh-cn/library/618ayhy6.aspx) [C# 编程指南](https://msdn.microsoft.com/zh-cn/library/67ef8sbd.aspx) [C# 关键字](https://msdn.microsoft.com/zh-cn/library/x53a06bb.aspx) [using 指令(C# 参考)](https://msdn.microsoft.com/zh-cn/library/sf0df423.aspx) [Garbage Collection](https://msdn.microsoft.com/zh-cn/library/0xy59wtx.aspx) [Implementing a Dispose Method](https://msdn.microsoft.com/zh-cn/library/fs2xkftw.aspx)