我想知道是否有某种备忘单,哪些对象与 using 语句相得益彰...... SQLConnection
,MemoryStream
等等。
更进一步,展示其他“拼图”会很棒,例如connection.Close()
在使用语句括号结束之前您应该如何实际调用。
有这样的东西存在吗?如果没有,也许我们应该做一个。
我想知道是否有某种备忘单,哪些对象与 using 语句相得益彰...... SQLConnection
,MemoryStream
等等。
更进一步,展示其他“拼图”会很棒,例如connection.Close()
在使用语句括号结束之前您应该如何实际调用。
有这样的东西存在吗?如果没有,也许我们应该做一个。
也许看看我在http://www.lancemay.com/2010/01/idisposable-cheat-sheet/上的帖子。不确定这是否是您要寻找的东西,但根据原始问题,听起来可能是这样。
Microsoft FxCop 有一个规则检查您在 using 块中使用 IDisposbale。
以下 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 框架支持的文本编码的完整列表。
如果您不确定一个类是否实现IDisposable
,请将其包含在一个using
块中。如果您收到编译错误,只需将其删除。您只会损失几秒钟的打字时间。
除了其他答案,请注意一个类可能实现 IDisposable 但没有 Dispose 出现在智能感知列表中。
class MyClass :IDisposable
{
void IDisposable.Dispose()
{
/* Stuff */
}
}
如果您使用的是 Visual Studio,您可以在类型声明上按 F12,它将带您进入元数据屏幕或类定义(如果您有源代码)。如果您的键绑定不同,请右键单击并“转到定义”。从那里你可以看到一个类实现了什么。我建议您在第一次遇到所有班级时都这样做,以“感受”班级可以做什么。
获取实现 IDisposable 的类型列表的一种简单方法是打开 Reflector,导航到System.IDisposable
,展开节点,然后展开“Derived Types”节点。
为确保您的列表是完整的,请确认您使用的所有程序集都已在 Reflector 中“打开”。
使用 ReSharper,您可以显示所有派生类型。也许您也可以在没有 ReSharper 的情况下使用对象浏览器来做到这一点。转到接口定义并查找“显示继承者”。
检查类型是否实现 IDisposable 的一种快速而简单的方法是创建它的实例并检查该实例是否具有 Dispose() 成员函数。如果是这样,那么您可以 99% 确定它实现了 IDisposable。