170 похожих чатов

Вопрос по правильному использованию using с объектами, реализующими интерфейс IAsyncDisposable

в C# 9.0
using var responseStream = await response.Content.ReadAsStreamAsync(cancellationToken);
await using var responseStream = await response.Content.ReadAsStreamAsync(cancellationToken);
Какой из вариантов правильнее? И есть ли вообще разница в откомпилированном коде?
VS вполне устраивает первый вариант, решарпер настаивает на втором.
Если смотреть документацию Майкрософт, то я не вижу необходимости в await в начале строки:
https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/using-statement

22 ответов

18 просмотров

Оформи код кодом

Пока не очень понял вопроса using генерит код для IDisposable интерфейса, await using генерит код для IAsyncDisposable интерфейса

2 вариант сразу задиспозит. Надо скобками обрамлять. 1 вариант он не будет ждать диспоза

А он первый вариант даже и не дает сделать

Второй лучше.

Rustam
screenshot А он первый вариант даже и не дает сделать

Наверное, у тебя тут объект, не поддерживающий синхронный диспоз вообще?

Алексей Шокарев
нет, смотрите документацию

Где я не прав? Попробуй реализовать IAsyncDisposable и вызвать на нем обычный using

Алексей-Шокарев Автор вопроса
Andrew Shurunov
Где я не прав? Попробуй реализовать IAsyncDisposab...

Если объект реализует IAsyncDisposable вместо IDisposable, то инструкция using вызывает DisposeAsync и awaits, возвращенный ValueTask.

Алексей Шокарев
Если объект реализует IAsyncDisposable вместо IDis...

И? Ещё раз, сделай пустой класс с IAsyncDisposable и напиши: using var d = new MyAsyncDisposable();

Алексей-Шокарев Автор вопроса
Rustam
screenshot А он первый вариант даже и не дает сделать

Все он дает сделать в C# 9.0. Этот функционал появился в C# 8.0. По дефолту обычно 7.1 стоит

Алексей-Шокарев Автор вопроса
Rustam
Это 9

Не верю

Алексей-Шокарев Автор вопроса
Rustam
Хорошо

Я взял пример из работающего кода.

Алексей Шокарев
Я взял пример из работающего кода.

Я только что попробовал, у меня не работает Так что жду пруфа, что твой тип не реализует IDisposable

Алексей-Шокарев Автор вопроса
Rustam
И там реализован IDisposible?

<PropertyGroup> <TargetFramework>net5.0</TargetFramework> <Nullable>enable</Nullable> <LangVersion>9</LangVersion> </PropertyGroup>

Алексей-Шокарев Автор вопроса
Алексей Шокарев
Можно свойства проекта. Там точно C# 9.0?

Я даже глянул хабровскую и микрософотвскую статьи про новые фичи, там нет упоминаний https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0AXEBLANmgExAGoAfAAQCYBGAWAChyAGAAnOoFYBuB8gZjaUWAQQAiLECwCSwgM4BPAHZhR2WQAcIsgIbBcMAN4M2A8gA4WANW24ArjHJIWqjVphylYABQBKI/RYAXwZg+l5TIQBhFn8WOJM2FBYAWV8Y43jM5hYAN20oFm0CFgBeFkUYAHcRUV8eAPjQwKA===

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта