в 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
Оформи код кодом
Пока не очень понял вопроса using генерит код для IDisposable интерфейса, await using генерит код для IAsyncDisposable интерфейса
2 вариант сразу задиспозит. Надо скобками обрамлять. 1 вариант он не будет ждать диспоза
Второй лучше.
Наверное, у тебя тут объект, не поддерживающий синхронный диспоз вообще?
нет, смотрите документацию
Где я не прав? Попробуй реализовать IAsyncDisposable и вызвать на нем обычный using
Если объект реализует IAsyncDisposable вместо IDisposable, то инструкция using вызывает DisposeAsync и awaits, возвращенный ValueTask.
И? Ещё раз, сделай пустой класс с IAsyncDisposable и напиши: using var d = new MyAsyncDisposable();
Все он дает сделать в C# 9.0. Этот функционал появился в C# 8.0. По дефолту обычно 7.1 стоит
Не верю
Хорошо
Я взял пример из работающего кода.
И там реализован IDisposible?
Я только что попробовал, у меня не работает Так что жду пруфа, что твой тип не реализует IDisposable
<PropertyGroup> <TargetFramework>net5.0</TargetFramework> <Nullable>enable</Nullable> <LangVersion>9</LangVersion> </PropertyGroup>
Можно свойства проекта. Там точно C# 9.0?
Я даже глянул хабровскую и микрософотвскую статьи про новые фичи, там нет упоминаний https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0AXEBLANmgExAGoAfAAQCYBGAWAChyAGAAnOoFYBuB8gZjaUWAQQAiLECwCSwgM4BPAHZhR2WQAcIsgIbBcMAN4M2A8gA4WANW24ArjHJIWqjVphylYABQBKI/RYAXwZg+l5TIQBhFn8WOJM2FBYAWV8Y43jM5hYAN20oFm0CFgBeFkUYAHcRUV8eAPjQwKA===
Обсуждают сегодня