Комментарии 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()
.
Явное управление ресурсами: пробуем новую фичу JavaScript и TypeScript