2017-01-19 8 views
2

У меня есть метод Foo, который возвращает объект IDisposable. Часто, когда этот метод вызывается, используется возвращаемое значение. Однако в этом случае мне нужен метод, который нужно вызвать, но не нужно возвращаемое значение. Правильно ли это сделать, чтобы немедленно позвонить Dispose? Если да, то имеет значение, какое из нижеследующих я делаю?C# Метод возвращает Одноразовый, который не используется

Foo().Dispose(); 

или

using(Foo()) 
{ 
} 

или просто

Foo(); 
+1

Это было бы самоуверенно, но мой голос за первый вариант. – Abion47

ответ

4

Если объект реализует IDisposable, то вы должны вызвать метод Dispose, когда вы закончите с объектом. Dispose предназначен для выпуска ресурсов, которые не должны удерживаться до цикла GC (Garbage Collector) (или вещей, которые не покрываются GC). Когда GC обнаруживает, что объект больше не используется, он будет вызывать финализатор объектов, но невозможно предсказать, когда это произойдет. Поэтому интерфейс IDisposable был создан так, чтобы программисты могли явно распоряжаться ресурсами объекта (он не удаляет объект, GC все еще делает это).

Я думаю, что я предпочел бы

Foo().Dispose(); 

, но это действительно не имеет значения (между двумя первыми). Если вы просто используете «Foo();» то вы не уважаете шаблон Dispose, который был бы неправильным. Вы можете попытаться определить, какие ресурсы создает объект, возможно, есть способ получить необходимую информацию, не создавая объект, который нуждается в утилизации.

+1

Обратите внимание, что 'Foo(). Dispose()' может вызывать NRE. 'использование' материально лучше. –

+0

Очень хорошая точка, метод Dispose может выдавать и исключать, и это следует учитывать. Даже для использования этого утверждения недостаточно для защиты от этого (см. Https://msdn.microsoft.com/en-us/library/aa355056(v=vs.110).aspx) – Dweeberly

+0

Игнорирование этих редких плохих 'Dispose' методов, более вероятно, что 'Foo()' возвращает 'null' и вызывает NRE. –

 Смежные вопросы

  • Нет связанных вопросов^_^