Есть ли список общих объектов, которые реализуют IDisposable для оператора using? - PullRequest
16 голосов
/ 23 июня 2009

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

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

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

Ответы [ 9 ]

15 голосов
/ 29 апреля 2010

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

10 голосов
/ 23 июня 2009

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

7 голосов
/ 24 июня 2009

Следующий метод 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.

4 голосов
/ 23 июня 2009

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

3 голосов
/ 10 июля 2009

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

3 голосов
/ 10 июля 2009

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

class MyClass :IDisposable
{
    void IDisposable.Dispose()
    {
        /* Stuff */
    }
}
2 голосов
/ 23 июня 2009

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

Чтобы убедиться, что ваш список заполнен, убедитесь, что все сборки, которые вы используете, были «открыты» в Reflector.

1 голос
/ 23 июня 2009

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

0 голосов
/ 24 июня 2009

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

...