Безопасно ли создавать и использовать одноразовый объект?
Я видел так много разработчиков, которые использовали одноразовый объект inline, здесь. По встроенным я имею в виду:
var result = new DataTable().Compute("1 + 4 * 7", null);
Я знаю, что метод Dispose
не будет вызываться, но поскольку ссылка на объект не указана, как обработчик мусора справится с этим? Безопасно ли использовать одноразовый объект?
Я использовал DataTable
в моем примере, потому что это единственный конкретный пример, который я нашел, но мой вопрос относится к одноразовым объектам вообще. Я лично их не использую, я просто хотел знать, если они будут обрабатываться с помощью GC, если они будут использованы таким образом.
Ответы
Ответ 1
Ключевой проблемой здесь является время, когда вызывается Dispose
, что просто неизвестно в вашем примере (обеспечивая хорошую реализацию IDisposable
- см. ниже). Я бы подумал об использовании экземпляра IDisposable
без инструкции using
в качестве запаха кода. Класс реализует IDisposable
по какой-либо причине, и поэтому вы, как пользователь, должны подчиняться его контракту.
Однако обратите внимание, что в правильной реализации в IDisposable
финализатор класса обрабатывает удаление объекта, который не удаляется. Следовательно, даже если не создается экземпляр внутри using
, удаление должно выполняться, но в неизвестном времени и в другом (GC) потоке.
Я просто хотел знать, если они будут обрабатываться с помощью GC, если они используются таким образом.
Нет, GC обрабатывает все объекты одинаково и не рассматривает реализации IDisposable
так или иначе. Однако при правильной реализации IDisposable
метода Finalize
(вызываемого GC для каждого объекта, если он не подавлен для каждого объекта), вызов приведет к вызову Dispose
.
Ответ 2
Если объект, который инициализируется inline, имеет реализованный деструктор, этот деструктор может вызвать Dispose() после того, как объект вышел из области видимости.
Однако, более чистый и правильный способ - использовать оператор using, потому что это потенциально может привести к простому обходу объектов без каких-либо целей.
Ответ 3
Небезопасно использовать одноразовые объекты таким образом. Да, ссылка не будет использоваться, но цель одноразового шаблона - распоряжаться всеми неуправляемыми ресурсами (такими как дескрипторы ОС), которые не могут быть собраны в мусор.