Ответ 1
Microsoft FxCop имеет правило, проверяющее, что вы используете IDisposbale в используемом блоке.
Мне было интересно, есть ли какой-то чит-лист, для которого объекты хорошо сочетаются с оператором using... SQLConnection
, MemoryStream
и т.д.
Сделав еще один шаг, было бы здорово показать другие "кусочки головоломки", например, как вы должны называть connection.Close()
перед закрытием, используя операторную скобку.
Что-нибудь подобное существует? Если нет, возможно, мы должны сделать это.
Microsoft FxCop имеет правило, проверяющее, что вы используете IDisposbale в используемом блоке.
Возможно, взгляните на мой пост на этом http://www.lancemay.com/2010/01/idisposable-cheat-sheet/. Не уверен, что то, что вы ищете, но на основе оригинального вопроса, похоже, что это возможно.
Следующий метод С# перечислит все типы 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:\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 в списке intellisense.
class MyClass :IDisposable
{
void IDisposable.Dispose()
{
/* Stuff */
}
}
Простым способом получить список типов, реализующих IDisposable, является взломать Reflector, перейти к System.IDisposable
, развернуть node, а затем развернуть "Производные типы" node.
Чтобы убедиться, что ваш список завершен, убедитесь, что все используемые вами сборки были "Open'ed in Reflector".
Если вы используете Visual Studio, вы можете нажать F12 в объявлении типа, это приведет вас к экрану метаданных или определению класса (если у вас есть исходный код). Если вы поменяете ключевые слова, щелкните правой кнопкой мыши и "перейдите к определению". Оттуда вы можете увидеть, что класс реализует. Я предлагаю сделать это для всех классов в первый раз, когда вы столкнетесь с ними, чтобы получить "почувствовать" то, что класс может сделать.
С помощью ReSharper вы можете показать все производные типы. Возможно, вы можете сделать это с браузером объектов без ReSharper. Перейдите к определению интерфейса и найдите "show inheritors".
Быстрый и грязный способ проверить, реализует ли тип IDisposable, создать его экземпляр и проверить, имеет ли экземпляр функцию Dispose(). Если это так, вы можете быть на 99% уверены, что он реализует IDisposable.