【问题标题】:Do I need to use multiple using statements?我需要使用多个 using 语句吗?
【发布时间】:2013-06-08 18:34:51
【问题描述】:

为了实用起见,这两个类都是一次性的。

我了解 using 块的作用。但我不确定它可以或需要使用的所有方式。

例如这是正确的吗?

using (MyClass myClass = new MyClass(params))
{
     myClass.name = "Steve";

     SecondClass myClassSecond = new SecondClass(params);
     myClassSecond.name = "George";
     myClassSecond.msg = "Hello Man in the Yellow Hat";
}

上面的两个类都被处理掉了吗?

或者我需要在 using 语句中同时使用两者?

using (MyClass myClass = new MyClass(params))
{
     myClass.name = "Steve";

     using (SecondClass myClassSecond = new SecondClass(params))
     {
          myClassSecond.name = "George";
          myClassSecond.msg = "Hello Man in the Yellow Hat";
     }
}

以上是否正确,或者有没有更好的方法来使用多个 using 语句?

【问题讨论】:

标签: c# asp.net using-statement


【解决方案1】:
  • using 语句允许程序员指定使用资源的对象何时应该释放它们。
  • 提供给 using 语句的对象必须实现 IDisposable 接口。
  • 该接口提供Dispose方法,应该释放对象的资源。

这是使用 using 语句的示例:

using System;
//Object of this class will be given to using hence IDisposable
class C : IDisposable        
{
    public void UseLimitedResource()
    {
        Console.WriteLine("Using limited resource...");
    }

    //Dispose() Method
    void IDisposable.Dispose()
    {
        Console.WriteLine("Disposing limited resource.");
    }
}

class Program
{
    static void Main()
    {
        using (C c = new C())  //Object of Class defined above
        {
            c.UseLimitedResource();
            //Object automatically disposed before closing.
        }                            
        Console.WriteLine("Now outside using statement.");
        Console.ReadLine();
    }
}

在以下情况下可以退出 using 语句:

  • 到达using 语句的结尾或
  • 如果抛出异常并且控制在语句结束之前离开语句块。

哪种方法合适?

正如你所说的

为了实用,这两个类都是一次性的

.,那么您的第二种方法是合适的方法。那就是:

using (MyClass myClass = new MyClass(params))
{
     myClass.name = "Steve";

     using (SecondClass myClassSecond = new SecondClass(params))
     {
          myClassSecond.name = "George";
          myClassSecond.msg = "Hello Man in the Yellow Hat";
     }
}

【讨论】:

    【解决方案2】:

    当您使用任何实现IDisposable 接口的东西时,使用块很方便。 MSDN:

    [using Statement] 定义一个范围,一个或多个对象将被释放。

    所以,这些实际上相当于

    IDisposable resource = new Whatever();
    try {
        // whatever
    }
    finally {
        resource.Dispose();
    }
    

    using 的主要优点是:它会在离开 using 块时自动处理对象,因此(1)您不会忘记这样做,(2)它会在出现异常时进行清理。

    短规则:

    • 任何时候打开文件/数据库连接或创建需要任何类型清理的类实例 - 在using 块中执行。
    • 如果对象的生命周期应该扩展方法范围 - 将其包装在一个类中,在该类中实现 IDisposable,在构造函数中实例化资源,在 Dispose 中进行清理。

    【讨论】:

      【解决方案3】:

      假设 SecondClass 确实是可丢弃的,您的第二个示例是正确的。如果是第一个示例不正确,因为 mySecondClass 将不会被处理。如果一个代码块控制了一次性实例的生命周期,它应该总是处理它。

      仅供参考,我更喜欢这种将多个对象放置在同一块中的样式,因为我发现它更具可读性。

      using (MyClass myClass = new MyClass(params))
      using (SecondClass myClassSecond = new SecondClass(params))     
      {
           myClassSecond.name = "George";
           myClassSecond.msg = "Hello Man in the Yellow Hat";     
      }
      

      usings 共享相同的作用域,并按声明的相反顺序 Dispose。

      【讨论】:

      • 这就是我要找的,谢谢。我不确定是否将所有东西都放在一个使用块中,或者是否需要将每件物品都包裹在它自己的个人一次性泡沫中。这两个项目确实是一次性的,我忽略了那个信息。再次感谢。
      【解决方案4】:

      using 块不会自动释放任何实现 IDisposable 的子对象。如果您想要处理内部一次性用品,则必须将其包裹在 using 块中。但是,您确实有几个不同的选择。

      您可以嵌套多个 using 块,它们从最内层到最外层进行评估。有一种更好的方法可以做到这一点,但以下示例有效:

      using (MyClass myClass = new MyClass(parameters))
      {
           using (SecondClass myClassSecond = new SecondClass(parameters))
           {
                myClassSecond.name = "George";
                myClassSecond.msg = "Hello Man in the Yellow Hat";
           }
      }
      

      如果声明是连续的并且您不需要在其间做任何事情,那么下面的语法会更简洁:

      using (MyClass myClass = new MyClass(parameters))
      using (SecondClass myClassSecond = new SecondClass(parameters))
      {
          myClassSecond.name = "George";
          myClassSecond.msg = "Hello Man in the Yellow Hat";
      }
      

      如果您需要在声明之间做一些事情,那么您的后一个示例是正确的:

      using (MyClass myClass = new MyClass(parameters))
      {
           myClass.name = "Steve";
      
           using (SecondClass myClassSecond = new SecondClass(parameters))
           {
                myClassSecond.name = "George";
                myClassSecond.msg = "Hello Man in the Yellow Hat";
           }
      }
      

      【讨论】:

        【解决方案5】:

        我的经验法则是……如果它实现了一次性,我使用 using 块。

        总是比抱歉更安全。

        要回答你的问题,我会选择第二个选项。

        【讨论】:

          【解决方案6】:

          简单的答案是,如果类有 dispose 方法,请使用 using。

          http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx

          如果没有,则不需要。

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

          我一直希望这在 MSDN 文档中更能体现在您的面前。归根结底,是实现 IDisposable 的类,但我真正想要的是页面上某种以某种方式显示的巨型图标。 '注意假人!你必须自己管理这个!'

          【讨论】:

            【解决方案7】:

            using 块纯粹是一种处理 IDisposable 对象的语法简单方法。如果您了解using 的作用,那么您应该了解它可以并且应该如何使用。

            请参阅此问题以了解 using 块被翻译成的确切内容: Uses of "using" in C#

            【讨论】:

              【解决方案8】:

              这取决于这些类是什么以及它们如何处理所使用的任何资源。 using 语句本质上与 try/finally 块(不是 catch)相同,后者在 finally 块中处理其资源(通过在相关对象上调用 .Dispose())。

              所以,首先,如果有问题的类没有实现IDisposable,那么这是一个有争议的问题,在这种情况下,您不能using 块中使用它。如果它确实实现了IDisposable,那么它这样做是有原因的,当你完成它时,应该在该对象上调用.Dispose()。在这些情况下,谨慎的做法是将其包装在 using 块中以保证处置。 (好吧,“保证”就像finally 块将被执行。这是通常的情况,除非发生了更糟糕的事情。)

              【讨论】:

                【解决方案9】:

                如果我创建的类使用大量资源,或者如果我将其创建为文件处理或网络资源的包装器,我喜欢在我创建的类中实现 IDisposable

                在我使用的类对象中,如果相关对象打开文件、创建网络连接等,我认为使用 using 块调用很重要。

                一些开发人员会编写一个实现IDisposable 的类,这样他们就可以将他们的代码放在看起来更干净的using 块中,但我认为这滥用了创建一次性东西的原因。

                【讨论】:

                  猜你喜欢
                  • 2017-06-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-04-20
                  • 2011-02-25
                  • 1970-01-01
                  相关资源
                  最近更新 更多