Есть ли список общих объектов, которые реализуют 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.

Другие вопросы по тегам