await using 是 C# 8.0 引入的语法糖,专用于异步释放实现 IAsyncDisposable 的资源;它调用 DisposeAsync()(返回 ValueTask),而普通 using 调用同步 Dispose(),二者不可互换,且 await using 仅限局部作用域使用。
什么是await usingusingawait usingIAsyncDisposableusingusingIDisposable.Dispose()await usingIAsyncDisposable.DisposeAsync()ValueTaskIDisposableawait usingerror CS8400: Feature 'async disposable' is not available in C# 7.3cannot await ... because it does not implement 'IAsyncDisposable'IAsyncDisposableFileStreamHttpClient.csproj8.0 IAsyncDisposableawait usingawait usingusingDisposeAsync()public static async Task ReadFileAsync()
{
await using var stream = new FileStream("data.bin", FileMode.Open);
await using var reader = new StreamReader(stream);
var content = await reader.ReadToEndAsync();
// stream 和 reader 的 DisposeAsync() 会在 } 处按逆序自动调用
}classawait using FileStream _fs = ...;await usingawait using (var x = ...) { ... }await using var x = ...;await using var a = new MemoryStream();MemoryStreamIAsyncDisposableawait usingawait x.DisposeAsync()await x.DisposeAsync()tryreturnfinallyawait usingtry/finallyDisposeAsync()DisposeAsync()Dispose()await usingawait usingusingStreamReaderFileStreamawait using var fs = new FileStream("log.txt", FileMode.Append);
await using var sw = new StreamWriter(fs); // 依赖 fs
await sw.WriteLineAsync("Done."); // 可能抛异常
// sw.DisposeAsync() 先执行,再 fs.DisposeAsync()DisposeAsync()FileStream.DisposeAsync()await usingawait usingDisposeAsync()