7

可能的重复:
在 c# 中使用 using 语句
什么是 C# Using 块,为什么要使用它?

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

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,但它出现了用于包含 dll 和其他文件的“使用”关键字。

4

8 回答 8

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 决定它需要所有者使用的内存之前,这些关键资源可能不会被放弃。因此,您肯定希望在使用完对象后将其丢弃(如果它们是一次性的)!

至于为什么要使用usingover 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直接调用可能会抛出一个NullReferenceExceptionifx为 null,using(x)但不会。

也可以看看:

于 2010-01-25T23:54:40.530 回答
4

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

在您的示例中, cmd2 将在 {} 中的代码完成时被释放。

于 2010-01-25T23:54:17.223 回答
2

“定义一个范围,一个或多个对象将在该范围之外被释放”
参见using 语句

于 2010-01-25T23:54:40.437 回答
2

using应用于实现IDisposable. 它确保在离开using块时(无论是正常情况下,还是通过异常,或其他方式),一次性对象的Dispose方法被调用。

于 2010-01-25T23:54:41.100 回答
0

Using 语句定义了一个范围,在该范围之外,一个或多个对象将被释放。

于 2010-01-25T23:54:43.103 回答
0

using 是一种很酷的资源清理方式,相当于 try{}catch{}finally{dispose}。Effective c# 对此有一个项目,我打赌你会得到 10 多个类似的答案。

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

于 2010-01-25T23:54:52.707 回答
0

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

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

于 2010-01-25T23:55:54.490 回答
0

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

using 语句将其内部的变量封装在一个范围内。当执行退出 using 块时,其中的所有对象都从内存中释放。您可能会在 DB 连接中看到它,因此当 using 块退出时,分配给该连接的资源会被清理并关闭。

于 2010-01-25T23:56:24.880 回答