【问题标题】:What does Using(.....){...} mean [duplicate]Using(.....){...} 是什么意思[重复]
【发布时间】:2011-01-09 08:18:03
【问题描述】:

可能的重复:
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,但它出现了用于包含 dll 和其他文件的 'using' 关键字。

【问题讨论】:

  • 参见 C# 规范的第 8.13 节。
  • 你也可以在 SO 上尝试快速搜索,你会发现你创建了一个重复的问题。
  • Zano:这可能对他没有多大帮助,这取决于他是否知道自己在寻找什么。在 C# 中,“using”关键字有两种完全不同的含义。
  • 我怀疑大多数开发人员甚至没有意识到 c# 规范的存在。

标签: c# idisposable using using-statement


【解决方案1】:

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 为空,则直接调用x.Dispose 可能会抛出NullReferenceException,而using(x) 不会。

另见:

【讨论】:

  • 关键是“您必须等待垃圾收集器释放保留的资源。” +1
  • 当离开 using 块时,IDisposable.Dispose 将被调用。如果您还明确定义了 IDisposable.Dispose,这可能与您的对象定义的 Dispose 方法不同。
  • 感谢您在尝试之前编辑修复声明的位置和变量的初始化。删除了我指出缺陷的评论。
  • +1 不知道级联语法技巧。
【解决方案2】:

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

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

【讨论】:

  • 总是实现IDisposable
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          “定义一个范围,一个或多个对象将被释放到该范围之外”
          using statement

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

            • 好的,我明白了,但为什么会这样写呢?在我看来,using 不传达 Hey Compiler please clean up after me?
            猜你喜欢
            • 2011-03-09
            • 2023-04-10
            • 2020-04-22
            • 1970-01-01
            • 1970-01-01
            • 2010-11-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多