Подтвердить что ты не робот

Есть ли список общих объектов, которые реализуют IDisposable для оператора using?

Мне было интересно, есть ли какой-то чит-лист, для которого объекты хорошо сочетаются с оператором using... SQLConnection, MemoryStream и т.д.

Сделав еще один шаг, было бы здорово показать другие "кусочки головоломки", например, как вы должны называть connection.Close() перед закрытием, используя операторную скобку.

Что-нибудь подобное существует? Если нет, возможно, мы должны сделать это.

4b9b3361

Ответ 1

Microsoft FxCop имеет правило, проверяющее, что вы используете IDisposbale в используемом блоке.

Ответ 2

Возможно, взгляните на мой пост на этом http://www.lancemay.com/2010/01/idisposable-cheat-sheet/. Не уверен, что то, что вы ищете, но на основе оригинального вопроса, похоже, что это возможно.

Ответ 3

Следующий метод С# перечислит все типы 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.

Ответ 4

Если вы не знаете, реализует ли класс IDisposable или нет, заключите его в блок using независимо. Если вы получите ошибку компиляции, просто удалите ее. Вы потеряете только несколько секунд, набрав время.

Ответ 5

В дополнение к другим ответам обратите внимание, что класс может реализовать IDisposable, но не иметь Dispose в списке intellisense.

class MyClass :IDisposable
{
    void IDisposable.Dispose()
    {
        /* Stuff */
    }
}

Ответ 6

Простым способом получить список типов, реализующих IDisposable, является взломать Reflector, перейти к System.IDisposable, развернуть node, а затем развернуть "Производные типы" node.

Чтобы убедиться, что ваш список завершен, убедитесь, что все используемые вами сборки были "Open'ed in Reflector".

Ответ 7

Если вы используете Visual Studio, вы можете нажать F12 в объявлении типа, это приведет вас к экрану метаданных или определению класса (если у вас есть исходный код). Если вы поменяете ключевые слова, щелкните правой кнопкой мыши и "перейдите к определению". Оттуда вы можете увидеть, что класс реализует. Я предлагаю сделать это для всех классов в первый раз, когда вы столкнетесь с ними, чтобы получить "почувствовать" то, что класс может сделать.

Ответ 8

С помощью ReSharper вы можете показать все производные типы. Возможно, вы можете сделать это с браузером объектов без ReSharper. Перейдите к определению интерфейса и найдите "show inheritors".

Ответ 9

Быстрый и грязный способ проверить, реализует ли тип IDisposable, создать его экземпляр и проверить, имеет ли экземпляр функцию Dispose(). Если это так, вы можете быть на 99% уверены, что он реализует IDisposable.