Должен ли я вызвать метод Dispose для изображения получить из буфера обмена в C # - PullRequest
2 голосов
/ 23 декабря 2010

В C # /. NET метод Clipboard.GetData() возвращает объект из буфера обмена.

Если возвращаемый объект реализует интерфейс IDisposable (например, экземпляр класса Image), является ли онмоя обязанность вызывать для него метод Dispose (или использовать конструкцию «using»)?

В документации GetData ничего особенного не сказано, поэтому я предполагаю, что объект Clipboard правильно удаляет все.Но мои предположения могут быть неверными.

Ответы [ 3 ]

2 голосов
/ 23 декабря 2010

Подобные вопросы сложно. Общее правило заключается в том, что владелец объекта IDisposable отвечает за вызов Dispose. Когда я вижу такой метод, как GetData, я сразу же думаю, что его семантика подразумевает передачу права собственности на объект IDisposable от вызываемого к вызывающему. Так что да, я бы предположил, что вы несете ответственность. Теперь, с другой стороны, если бы вместо этого было свойство с именем Data, я бы тогда предположил, что право собственности по-прежнему принадлежит содержащему объекту, поскольку свойство имеет общую семантику предоставления доступа к удерживаемому экземпляру. Проблема заключается в том, что разработчики API часто непоследовательны в определении того, кто является владельцем, и именно поэтому я говорю такие вопросы, как это сложно. Но, опять же, я думаю, что можно с уверенностью предположить, что в этом случае вам следует звонить Dispose.

2 голосов
/ 23 декабря 2010

Если бы я действительно хотел быть уверен, я бы посмотрел на функцию GetData () с .NET Reflector, чтобы увидеть, что она делает.Я предполагаю, что это создает копию изображения в памяти приложения.Вероятно, вам нужно избавиться от него.Даже если вам не нужно, множественные вызовы не причиняют вреда.

1 голос
/ 23 декабря 2010

Метод Dispose должен выполняться, если вы используете неуправляемые ресурсы (дескрипторы файлов, неуправляемую память и т. Д.).В таких случаях вы должны реализовать IDisposable и освободить ресурсы в методе Dispose.

Поскольку вы используете GetData, которая возвращает собственный .NET Object, вам не нужно вызывать метод Dispose.

Пример приведен здесь .

...