Как стать автором
Обновить

Комментарии 6

Ура, в JavaScript появляются деструкторы

Странно, почему выбор того, вызывать dispose синхронно или асинхронно отдан вызывающему коду? По примерам выходит, что это определяется типом, содержащим метод?

У объектов может быть одновременно синхронный @@dispose и асинхронный @@asyncDispose. Допустим, первый может просто вызывать второй, но не дожидаться его завершения, а просто прицепить логирование ошибки в .catch() и вернуться.

Для вызывающего кода ошибка освобождения ресурса не всегда может быть фатальной, а такая реализация даст ему возможность не дожидаться конца процесса освобождения.

Вторая возможная причина - думаю, дизайнеры языка хотят, чтобы в коде были явно обозначены через await все "точки ожидания" в асинхронной функции. В том числе - вызов @@asyncDispose по выходу из области видимости.

Ну и полная аналогия с C# от того же MS - если тип реализует IDisposable с единственным методом void Dispose(), то объекты этого типа можно использовать с using var x = smth(). А если реализует IAsyncDisposable с единственным методом ValueTask DisposeAsync(), то можно делать await using var x = smth(). При этом тип может реализовывать оба этих интерфейса, и пользователь может выбирать, что вызвать (через using/await using)
IAsyncDisposable при этом появился гораздо позже, и после его появления в абстрактные классы стандартной библиотеки стали добавлять примерно такие реализации (пример из DbConnection)
public virtual ValueTask DisposeAsync()
{
Dispose();
return ValueTask.CompletedTask;
}

При этом мы сразу можем писать await using var connection, а асинхронным его освобождение станет тогда, когда авторы драйвера БД, которые своё соединение наследуют от DbConnection, реализуют его "по-настоящему"

Чота дичь какая-то, честно говоря... Зачем продолжают превращать язык, одной из фишек которого изначально было в том числе и полностью автоматическое управление ресурсами в какие-то кресты?

В языке было автоматическое управление памятью, но кроме нее хватает других ресурсов - открытые файлы, соединения с БД, подписки на события.

Плюс этот новый синтаксис даёт определенный детерминизм в том, когда ресурс будет освобождён, и что он будет освобождён вообще. Если надеяться только на сборщик мусора, то такого не получить - сравните вон в C#, к примеру, финализаторы (основаны полностью на GC) и Disposable.dispose().

Зарегистрируйтесь на Хабре, чтобы оставить комментарий