У меня есть другая перспектива ответить на это.
При работе на разных уровнях, например, в приложении MVC, контроллеру нужны службы для вызова бизнес-операций. В таких сценариях контейнер инжекции зависимостей может использоваться для инициализации служб, чтобы исключить исключение NullReferenceException. Это означает, что вам не нужно беспокоиться о проверке нулевого значения и просто вызвать службы с контроллера, как будто они всегда будут доступны (и инициализированы) как одиночный или прототип.
public class MyController
{
private ServiceA serviceA;
private ServiceB serviceB;
public MyController(ServiceA serviceA, ServiceB serviceB)
{
this.serviceA = serviceA;
this.serviceB = serviceB;
}
public void MyMethod()
{
// We don't need to check null because the dependency injection container
// injects it, provided you took care of bootstrapping it.
var someObject = serviceA.DoThis();
}
}
Правильный автоматический анализ Dispose требует DFA (анализ потока данных) глобальным способом. Маловероятно, что вы создаете объект IDisposable и не вызываете на нем никакого метода и не передаете его в качестве аргумента. Если одноразовый объект передается другим методам (включая вызов его членов, когда «это» неявно передается), инструмент должен проанализировать, не вызывается ли Dispose внутри, или что этот объект не хранится где-то для последующего удаления.
Тем не менее, наивная реализация проверки того, действительно ли располагаемый объект фактически размещен с конструкцией «использования» или каким-либо другим способом, даст слишком много ложных срабатываний и сделает анализ бесполезным.
См. это сообщение в блоге для некоторых трюков для тестирования для Dispose()
в DEBUG
. В принципе, напишите деструктор только для DEBUG, который утверждает, что вы были удалены.
Недовольство существующими методами, я создал свой собственный: EyeDisposable . Это прибор для ИИ, поэтому он должен улавливать много утечек, не попавших под статический анализ. Он все еще находится на ранней стадии, приветствуются inpuit.
Вы можете посмотреть на FXCop для этого: http://msdn.microsoft.com/en-us/library/ms182328 (VS.80) .aspx
Жаль, что R # не справляется с этим, даже если это предупреждение для полей вашего класса и / или переменных, которые вы создаете.
Вы можете создать небольшую надстройку для R #, которую вы могли бы запустить внутри редактора кода, который сканирует код и обновляет анализ кода, чтобы отразить то, что вы являетесь объектом, у которого отсутствует структура, которую вы только что описали.
Я бы заглянул в архитектуру плагина R #, если вы решите пойти по этому маршруту.
IDisposable
s, которые не используют себя в своих собственных методах. Неспособность избавиться от HttpResponseMessage может вызвать критические таймауты в других частях кода, и редко преднамеренно использоватьawait SendAsync()
без оператораusing
. В этих редких случаях люди могут использовать комментарии Решарпера и такие, чтобы показать, что они знают, что они делают. – StriplingWarrior 30 September 2015 в 21:50