【问题标题】:Is there a list of common object that implement IDisposable for the using statement?是否有为 using 语句实现 IDisposable 的常见对象列表?
【发布时间】:2010-11-05 05:20:11
【问题描述】:

我想知道是否有某种备忘单可以让对象与 using 语句配合得很好...SQLConnectionMemoryStream 等。

更进一步,展示其他“拼图”会很棒,例如您应该如何在使用语句括号结束之前实际调用connection.Close()

存在这样的东西吗?如果没有,也许我们应该做一个。

【问题讨论】:

  • 为什么需要在结束括号之前调用 connection.Close() ?我不知道还有很多其他的拼图。
  • 为什么是列表?您可以轻松检查对象是否实现 IDisposable。
  • @Groo:您确实必须检查文档,某些类型隐藏了 Dispose()。所以没那么容易。
  • @John Saunders:你确定不应该关闭 SQL 连接吗?
  • @John Saunders:让人们决定:stackoverflow.com/questions/1195829/…

标签: c# asp.net dispose idisposable using-statement


【解决方案1】:

使用 ReSharper,您可以显示所有派生类型。也许您也可以在没有 ReSharper 的情况下使用对象浏览器来做到这一点。转到接口定义并查找“显示继承者”。

【讨论】:

  • 也不知道 ReSharper,它适用于接口吗?它是项目范围的还是您可以包含 GAC 和其他文件夹?
  • 它适用于一切,可以包括库程序集,包括 GAC 中的程序集。您也可以单击分配,如果分配的类型实现 IDisposable,它将建议使用块。
【解决方案2】:

如果您不确定某个类是否实现了IDisposable,请将其包含在using 块中。如果您收到编译错误,只需将其删除。您只会损失几秒钟的打字时间。

【讨论】:

  • 大多数情况下,如果有 Dispose 方法,它将实现 IDisposable。
  • @weiqure - 但反之亦然
  • 总是反之亦然,因为没有 Dispose 方法就没有 IDisposable 实现类。而且我还没有看到一个有 Dispose 方法但没有实现 IDisposable 的类。
【解决方案3】:

Microsoft FxCop 有一个规则检查您在 using 块中使用 IDisposbale。

【讨论】:

    【解决方案4】:

    获取实现 IDisposable 的类型列表的一种简单方法是打开 Reflector,导航到 System.IDisposable,展开节点,然后展开“派生类型”节点。

    为确保您的列表完整,请确认您使用的所有程序集都已在 Reflector 中“打开”。

    【讨论】:

      【解决方案5】:

      以下 C# 方法将列出在某个程序集中找到的所有 IDisposable 类型。 (使用的命名空间:System、System.Collections.Generic、System.IO、System.Reflection)

        static void PrintDisposableTypesFromFile(String path)
        {
           Assembly assembly = Assembly.LoadFrom(path);
           foreach (Type type in assembly.GetTypes())
              if (type.GetInterface("IDisposable") != null)
                 Console.WriteLine(type.FullName);
        }
      

      以下 C# 方法利用前一个方法对目录及其子目录中的所有程序集执行相同的操作,例如"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727":

        static void PrintDisposableTypesFromDirectory(DirectoryInfo dir, bool warn)
        {
           foreach (FileInfo file in dir.GetFiles("*.dll"))
           {
              try
              {
                 PrintDisposableTypesFromFile(file.FullName);
              }
              catch (Exception ex)
              {
                 if (warn)
                 {
                    Console.Error.WriteLine(
                       String.Format(
                          "WARNING: Skipped {0}: {1}",
                          new object[] { file.FullName, ex.Message }));
                 }
              }
           }
           // recurse
           foreach (DirectoryInfo subdir in dir.GetDirectories())
              PrintDisposableTypesFromDirectory(subdir, warn);
      
        }
      

      我不确定所有一次性用品的列表是否很有用,但我使用类似的代码来查找其他有趣的东西,例如 .NET 框架支持的文本编码的完整列表。

      【讨论】:

      • 努力+1,但我认为只使用反射器会更容易:)
      【解决方案6】:

      检查一个类型是否实现 IDisposable 的一种快速而简单的方法是创建它的一个实例并检查该实例是否具有 Dispose() 成员函数。如果是这样,那么您可以 99% 确定它实现了 IDisposable。

      【讨论】:

        【解决方案7】:

        除了其他答案,请注意一个类可能实现 IDisposable 但没有 Dispose 出现在智能感知列表中。

        class MyClass :IDisposable
        {
            void IDisposable.Dispose()
            {
                /* Stuff */
            }
        }
        

        【讨论】:

          【解决方案8】:

          如果您使用的是 Visual Studio,您可以在类型声明上按 F12,它将带您进入元数据屏幕或类定义(如果您有源代码)。如果您的键绑定不同,请右键单击并“转到定义”。从那里你可以看到一个类实现了什么。我建议您在第一次遇到所有班级时都这样做,以“感受”班级可以做什么。

          【讨论】:

          • 是的,但不是每个实现 IDisposable 的类都直接实现它。以 DataTable 为例(顺便说一句,您不需要 Dispose ......但这是另一个对话 stackoverflow.com/questions/913228/…
          【解决方案9】:

          也许看看我在http://www.lancemay.com/2010/01/idisposable-cheat-sheet/ 的帖子。不确定这是否是您要查找的内容,但根据原始问题,听起来可能是。

          【讨论】:

          • 酷!这正是我最初想要的!
          • 哇这么多 cmets,而这就是答案!谢谢兰斯!
          • 链接已损坏!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-20
          • 2015-09-15
          • 2016-10-24
          • 1970-01-01
          • 2012-12-26
          • 1970-01-01
          相关资源
          最近更新 更多