Безопасно ли создавать и использовать одноразовый объект?

Я видел так много разработчиков, которые использовали одноразовый объект 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

Небезопасно использовать одноразовые объекты таким образом. Да, ссылка не будет использоваться, но цель одноразового шаблона - распоряжаться всеми неуправляемыми ресурсами (такими как дескрипторы ОС), которые не могут быть собраны в мусор.