使用新的 C# 8 using 声明语法,第二个连续的 using 语句的包含范围是什么?
TL;DR
在 C# 8 之前,有一个连续的 using 语句,例如:
using(var disposable = new MemoryStream())
{
using(var secondDisposable = new StreamWriter(disposable))
{}
}
将扩展到类似以下内容(我的来源 https://github.com/dotnet/csharplang/blob/master/spec/statements.md#the-using-statement):
MemoryStream disposable = new MemoryStream();
try {
{
StreamWriter secondDisposable = new StreamWriter(disposable);
try{
{}
}
finally {
if(secondDisposable != null) ((IDisposable)secondDisposable).Dispose();
}
}
}
finally {
if(disposable != null) ((IDisposable)disposable).Dispose();
}
我知道还有另外两种可能的扩展,但它们都大致是这样的
升级到 C# 8 后,Visual studio 提供了一个代码清理建议,我不确定我是否认为这是一个等效的建议。
它将上面的连续 using 语句转换为:
using var disposable = new MemoryStream();
using var secondDisposable = new StreamWriter(disposable);
对我来说,这会将第二个的范围更改为与第一个的范围相同。在这种情况下,它可能会巧合地以正确的顺序处理流,但我不确定我是否喜欢依赖这种巧合。
为了清楚 VS 要求我做什么:我首先转换了内部(这是有道理的,因为内部仍然包含在外部的范围内)。然后我转换了外部(这在本地是有意义的,因为它仍然包含在方法的范围内)。这两种清理的结合是我很好奇的。
我也认识到,我对此的想法可能略有(甚至严重)偏差,但据我今天的理解,这似乎并不正确。我的评估中缺少什么?我是不是偏离了基地?
我唯一能想到的是,在声明语句后面的所有内容的扩展中插入了某种隐式作用域。