使用(.....){...}是什么意思

时间:2010-01-25 23:51:14

标签: c# idisposable using using-statement

  

可能重复:
  Using the using statment in c#
  What is the C# Using block and why should I use it?

只是想知道这意味着什么?我在网上看过很多有语法的教程:

using (SqlCeCommand cmd2 = new SqlCeCommand("SELECT city FROM cities JOIN states ON states.id=cities.state WHERE states.state='" + read.GetString(0) + "'", con))
{
  SqlCeDataReader readCities = cmd2.ExecuteReader();
  while (readCities.Read())
  {
    parent.Nodes.Add(readCities.GetString(0));
  }
}

为什么使用它?我尝试搜索Google,但它提供了'using'关键字,用于包含dll和其他文件。

8 个答案:

答案 0 :(得分:33)

using声明

using(var disposableObject = new object_that_implements_IDisposable()) { ... }

是类似于以下代码的语法糖:

var disposableObject = new object_that_implements_IDisposable()
try
{
    ...
}
finally
{
    if(disposableObject != null)
    {
        ((IDisposable)your_object).Dispose();
    }
}

适用于实现IDisposable的类。它有助于清理代码,其中包含对象,例如,系统资源(文件句柄,数据库连接,套接字等)需要在完成后为了剩余的资源而释放资源。系统

理论上,您可以省略.Dispose()调用,但是您必须等待垃圾收集器释放保留的资源。 GC知道何时释放对象以回收其内存使用情况非常棒,但它不知道它需要释放对象以让它们放弃其他系统资源。因此,在GC决定需要所有者使用的内存之后,才可能放弃这些关键资源。因此,当你完成它们时(如果它们是一次性的),你绝对想要处理你的物品!

至于为何using使用try / finally,这纯粹是编码员的偏好。我更喜欢using,因为你可以级联它们:

using(var a = new class())
using(var b = new class())
using(var c = new class())
using(var d = new class())
{
    ...
}

使用try / finally,您需要更多行代码。

using还有其他优点。例如,如果x.Dispose为空,则直接调用NullReferenceException可能会抛出x,而using(x)则不会。{/ p>

另见:

答案 1 :(得分:4)

using只是指示编译器编写代码,该代码将使用对您使用的变量调用Dispose方法。只有实现“IDisposable”的类型才能与using语句一起使用。

在您的示例中,当{}中的代码完成时,将处理cmd2。

答案 2 :(得分:2)

“定义范围,在其范围之外将放置一个或多个对象” 见using statement

答案 3 :(得分:2)

using适用于实施IDisposable的对象。它确保在离开using块时(无论是正常的,还是通过异常,等等),都会调用一次性对象的Dispose方法。

答案 4 :(得分:0)

使用语句定义一个范围,在其外部将处理一个或多个对象。

答案 5 :(得分:0)

使用是清理资源的一种很酷的方式,它相当于try {} catch {} finally {dispose}。有效的c#有一个项目,我打赌你会得到10个以上类似的答案。

http://www.amazon.com/Effective-Specific-Ways-Improve-Your/dp/0321245660

答案 6 :(得分:0)

using语句定义了使用实现IDisposable接口的对象的范围。退出块后,将清理对象。参见:

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

答案 7 :(得分:0)

请参阅http://msdn.microsoft.com/en-us/library/yh598w02(VS.80).aspx

using语句将变量封装在范围内。当执行退出using块时,其中的所有对象都从内存中释放出来。您可能会看到它与数据库连接,以便当使用块退出时,清理和关闭分配给该连接的资源。