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