C#中using语句和指令的区别是什么?

6
这基本上是一个教程问题,因为我是初学者,我想知道我们在C#代码开头使用的using语句来包含程序集和命名空间之间的区别。
例如:
using System.Web.Services;

当我们在方法或代码内部编写代码时,可以像这样:

using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))

这两者有什么区别吗?还是说它们是一样的?您能提供任何指导将会很有帮助和感激。

4
这个问题出乎意料地难以找到重复的答案。 - BoltClock
1
第一个是using指令,允许您访问特定命名空间中定义的类型,而无需使用完全限定名称。第二个是using语句,允许您轻松处理可处理对象。 - Jeff Mercado
@user64:它们看起来像是在做同样的事情吗? - H H
可能是 C#中"using"关键字的用法 的重复问题。 - H H
嗯,我不是指这两个语句的作用相同,我是想问这两个使用语句是否相同。谢谢,Jeff Mercado。 - abhijit
显示剩余2条评论
5个回答

13

首先,使用指令可以将命名空间引入作用域。

例如,您可以这样写:

StringBuilder MyStringBuilder = new StringBuilder();

而不是

System.Text.StringBuilder MyStringBuilder = new System.Text.StringBuilder();

第二个(使用语句)用于正确地使用(创建和释放)实现IDisposable接口的对象。

例如:

using (Font font1 = new Font("Arial", 10.0f)) 
{
    byte charset = font1.GdiCharSet;
}

在这里,Font类型实现了IDisposable,因为它使用非托管资源,当我们不再使用Font实例(font1)时,需要正确释放这些资源。

1
在这个网站上,无需感谢,接受答案就足够表示感激了。 :) - George Duckett
“using” 还用于在不同的命名空间中有多个相同名称的“class”或“interface”时显式地使用一个“class”或“interface”。例如,如果您正在使用框架的“TimeZone”和“mynamespace”,并且需要使用“TimeZone”对象,则必须执行“using TimeZone = mynamespace.TimeZone”。 - Luiso

2

使用 (SqlDataAdapter adapter = new SqlDataAdapter(cmd))

这个 using 块会在控制流离开该块时自动处理 adapter 对象。

这等同于调用

SqlDataAdapter adapter = new SqlDataAdapter(cmd)
adapter.dispose();

请参考官方文档: http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.71).aspx

那不是直接等价的。更等价的做法是使用 try/finally。 - Moo-Juice
不行,这等同于:try { SqlDataAdapter adapter = new SqlDataAdapter(cmd); } finally { adapter.dispose(); } - Falanwe
这是 Dispose,其中 D 是大写。 - BoltClock

0

它们之间的差异就像你能够得到的那样大。

第一个展示了在命名空间中使用东西的意图。

第二个接受对可处理对象的引用,并确保它被处理,无论发生什么情况(就像实现try/finally一样)。


0

0

我相信有人会花费大量时间回答一个类似于谷歌搜索的问题,但这里有几个链接可以帮助你入门。

using Statement (C# Reference) 确保即使在调用对象方法时发生异常,Dispose 也会被调用。

为了允许使用命名空间中的类型,以便您不必限定该命名空间中的类型的使用,请使用 using Directive (C# Reference)

你可能会发现 MSDN 是一个很好的资源,可以花些时间浏览。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接