是否有一个为using语句实现IDisposable的公共对象列表?

时间:2009-06-23 15:33:26

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

我想知道是否存在某种类型的备忘单,其中的对象与使用声明相符...... SQLConnectionMemoryStream等。

更进一步,甚至展示其他“拼图”也很棒,就像你应该在结束前使用语句括号实际调用connection.Close()一样。

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

9 个答案:

答案 0 :(得分:15)

或许在http://www.lancemay.com/2010/01/idisposable-cheat-sheet/浏览我的帖子。不确定这是否是您正在寻找的,但根据原始问题,听起来可能是这样。

答案 1 :(得分:10)

Microsoft FxCop有一条规则检查您是否在使用块中使用IDisposbale。

答案 2 :(得分:7)

以下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 \框架\ 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框架支持的完整文本编码列表。

答案 3 :(得分:4)

如果您不确定某个类是否实现IDisposable,请将其括在using块中,无论如何。如果出现编译错误,只需将其删除即可。你只会输入几秒钟的打字时间。

答案 4 :(得分:3)

除了其他答案之外,请注意一个类可能会实现IDisposable但不会在intellisense列表中出现Dispose。

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

答案 5 :(得分:3)

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

答案 6 :(得分:2)

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

为确保您的列表完整,请验证您正在使用的所有程序集是否已在“反射器”中“打开”。

答案 7 :(得分:1)

使用ReSharper,您可以显示所有派生类型。也许你可以使用没有ReSharper的对象浏览器来完成它。转到界面定义并查找“show inheritors”。

答案 8 :(得分:0)

检查类型是否实现IDisposable的快速和脏方法是创建它的实例并检查实例是否具有Dispose()成员函数。如果确实如此,那么你可以99%确定它实现了IDisposable。