我想知道是否有一种作弊表,可以告诉我哪些对象最适合与 using
语句一起使用... SQLConnection
,MemoryStream
等等。
更进一步,甚至展示其他"谜题的部分",例如在关闭 using
语句括号之前应该如何调用 connection.Close()
。
有这样的东西吗? 如果没有,也许我们应该制作一个。
我想知道是否有一种作弊表,可以告诉我哪些对象最适合与 using
语句一起使用... SQLConnection
,MemoryStream
等等。
更进一步,甚至展示其他"谜题的部分",例如在关闭 using
语句括号之前应该如何调用 connection.Close()
。
有这样的东西吗? 如果没有,也许我们应该制作一个。
Microsoft FxCop有一条规则,检查你是否在using块中使用了IDisposable接口。
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);
}
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
代码块中。如果出现编译错误,只需将其删除即可。这样做只会浪费你几秒钟的打字时间。
class MyClass :IDisposable
{
void IDisposable.Dispose()
{
/* Stuff */
}
}