при кодировании, какой самый быстрый способ определить, является ли тип IDisposable - PullRequest
5 голосов
/ 04 июня 2009

С точки зрения производительности кодера, какой самый быстрый способ в VS 2005 или 2008 определить, реализует ли Foo IDisposable. Со мной не раз случалось, что меня ловили с использованием типа без блока using, потому что мне никогда не приходило в голову, что это необходимо для реализации IDisposable.

Ответы [ 10 ]

8 голосов
/ 04 июня 2009

Поместите его в оператор using и посмотрите, скомпилируется ли он:

using (var x = new TypeInQuestion(params)) {}

Это не скомпилируется, если TypeInQuestion не реализует IDisposable.

Другой самый быстрый способ - использовать ReSharper, щелкнуть по переменной (в данном случае x) и посмотреть, есть ли у нее предложение вставить ее в оператор using.

6 голосов
/ 04 июня 2009

Если у вас есть ReSharper , выделите переменную, дождитесь лампочки и нажмите Alt + Enter. Если один из вариантов «Обернуть с использованием», он IDisposable.

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

С помощью плагина ReSharper, установленного в Visual Studio, при наведении курсора на объявление переменной, как на stringWriter во фрагменте ниже:

TextWriter writer = new StringWriter();
writer.WriteLine("Test");

Вы можете выбрать «положить в» используя «конструкцию» из меню «лампочка», что превратит приведенный фрагмент в:

using (TextWriter writer = new StringWriter()) {
    writer.WriteLine("Test");
}

Если опция «положить в ...» отсутствует, тип не реализует IDisposable.

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

Вы можете сделать это в PowerShell, например,

[System.Management.Automation.Runspaces.pipeline].getinterface("IDisposable")

возвращает

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    IDisposable

, а

[datetime].getinterface("IDisposable")

ничего не возвращает.

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

В самых последних IDE, если у меня возникнет вопрос о том, реализует ли что-то IDisposible, я помещаю его в блок using. IDE сообщит вам, если это неправильно, еще до того, как вы закончите со следующей строкой кода.

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

Самый быстрый способ для меня, как правило, - это ввести блок using (используя фрагменты) для экземпляра типа, и в этом случае вы получите уведомление об ошибке, если тип не реализует IDisposable. Обычно это занимает пару секунд. Не супер удобно, но довольно быстро.

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

Если тип связан с IO, окнами / элементами управления или графикой, я обычно воспринимаю это как подсказку, что мне следует искать метод Dispose.

Кроме того, наличие метода Close может означать, что тип является одноразовым, например, если у вас есть ссылка на XmlReader (который является IDisposable), вы не можете увидеть метод Dispose, потому что он реализован явно.

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

К сожалению, нет «простого простого простого» способа.

Вам придется нажимать F12 по имени класса, а затем продолжать нажимать F12 по базовым классам, пока вы не окажетесь в базовом классе, если какой-либо из них реализует IDisposable, вы его получите.

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

Это не быстро сделать, но вы также можете запустить FXCop, и он будет предупреждать вас об объектах IDisposable, которые не находятся в блоке using ().

Работая над некоторым унаследованным кодом C # здесь, на работе, я обнаружил, что тот, кто написал его оригинально, фактически создал метод ".Dispose ()" почти для каждого класса, даже если он не нужен, но классы на самом деле не реализуют IDisposable. Что означает, что все они имеют метод Dispose (), но не могут быть помещены в блоки using () ... очень раздражает!

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

начните печатать и посмотрите, обнаружит ли intellisense метод .Dispose

(согласно комментариям быстро и (очень) грязно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...