Если я напишу следующий код:
public void Execute()
{
var stream = new MemoryStream();
...
}
тогда анализ кода пометит это как:
Предупреждение 1 CA2000: Microsoft.Reliability: в методе «ServiceUser.Execute()» вызовите System.IDisposable.Dispose для объекта «поток», прежде чем все ссылки на него будут вне области действия. C:\Dev\VS.NET\DisposeTest\DisposeTest\ServiceUser.cs 14 DisposeTest
Однако, если я создам фабричный шаблон, мне все равно может потребоваться избавиться от объекта, но теперь FxCop/Code Analysis не жалуется. Скорее, он жалуется на фабричный метод, а не на код, который его вызывает. (Кажется, у меня был пример, который жаловался на фабричный метод, но тот, который я публикую здесь, не , поэтому я вычеркнул это)
Есть ли способ, например, с помощью атрибутов, перенести ответственность за объект IDisposable из фабричного метода на вызывающую сторону?
Возьмите этот код:
public class ServiceUser
{
public void Execute()
{
var stream = StreamFactory.GetStream();
Debug.WriteLine(stream.Length);
}
}
public static class StreamFactory
{
public static Stream GetStream()
{
return new MemoryStream();
}
}
В этом случае никаких предупреждений нет. Я бы хотел, чтобы FxCOP/CA по-прежнему жаловался на мой первоначальный метод. Я по-прежнему обязан обращаться с этим объектом.
Могу ли я как-нибудь сообщить об этом FxCOP/CA? Например, недавно я рискнул изучить атрибуты аннотаций, которые предоставляет ReSharper, чтобы сообщить информацию об аналитическом механизме, которую иначе он не смог бы понять.
Итак, я представляю что-то вроде этого:
public static class StreamFactory
{
[return: CallerResponsibility]
public static Stream GetStream()
{
return new MemoryStream();
}
}
Или этот дизайн далеко?