Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# while循环中一次性变量的作用域何时结束?_C#_.net_.net Core_Scope - Fatal编程技术网

C# while循环中一次性变量的作用域何时结束?

C# while循环中一次性变量的作用域何时结束?,c#,.net,.net-core,scope,C#,.net,.net Core,Scope,我有一个while循环,在这个循环中,我用一个内存流做一些事情——即将它传递给其他填充该流或从中读取的对象。代码如下所示: public async void CaptureImages(CancellationToken ct) { while(!ct.IsCancellationRequested) { await using var memoryStream = new MemoryStream(); await this.camera.C

我有一个while循环,在这个循环中,我用一个内存流做一些事情——即将它传递给其他填充该流或从中读取的对象。代码如下所示:

public async void CaptureImages(CancellationToken ct)
{
    while(!ct.IsCancellationRequested)
    {
        await using var memoryStream = new MemoryStream();

        await this.camera.CaptureImage(memoryStream, ct);
        await this.storage.StoreImage(memoryStream, ct);
    }
}
我的问题是:
memoryStream
是在每次迭代中还是在循环结束后进行处理


虽然该问题一般回答了此主题,但它没有明确回答有关While循环中可处置变量的范围的问题。

内存流将在
While
循环块的末尾处理,因此,每次
while
循环迭代一次。

内存流将在
while
循环块的末尾进行处理,因此每次
while
循环迭代一次。

这就是执行代码的方式(我简化了您的方法,只包含必要的部分):


如您所见,
memoryStream
将在每次迭代中处理。您可以在中找到代码编译的中间步骤和结果。

这就是代码的执行方式(我简化了您的方法,只包括必要的部分):

如您所见,
memoryStream
将在每次迭代中处理。您可以在中找到代码编译的中间步骤和结果。

是正确的,但我想进一步解释一下为什么它是正确的:

这实际上是一个关于:

using声明是一个变量声明,前面有using关键字。它告诉编译器要声明的变量应该在封闭范围的末尾处理

基本上,
using
声明被编译为
using
语句,在封闭范围结束之前结束。 换句话说,您的代码将转换为:

while(!ct.IsCancellationRequested)
{
    await using(var memoryStream = new MemoryStream())
    {
        await this.camera.CaptureImage(memoryStream, ct);
        await this.storage.StoreImage(memoryStream, ct);
    }
}
现在,当
memoryStream
被释放时,这一点非常清楚了——在每次
while
迭代结束时。

是正确的,但我想展开一点来解释为什么它是正确的:

这实际上是一个关于:

using声明是一个变量声明,前面有using关键字。它告诉编译器要声明的变量应该在封闭范围的末尾处理

基本上,
using
声明被编译为
using
语句,在封闭范围结束之前结束。 换句话说,您的代码将转换为:

while(!ct.IsCancellationRequested)
{
    await using(var memoryStream = new MemoryStream())
    {
        await this.camera.CaptureImage(memoryStream, ct);
        await this.storage.StoreImage(memoryStream, ct);
    }
}

现在,当
memoryStream
被处理时,这一点非常清楚了——在每次
while
迭代结束时。

@Fildor感谢您的评论。这是while条件中的一个输入错误……也不相关:您有理由将此
异步无效
而不是
异步任务
?@Fidor是。此方法作为后台线程运行。这是否回答了您的问题@帕夫拉尼霍斯基只是部分。我显然对while循环感到困惑。然而,答案告诉我,我没有充分考虑这一点……;)@费尔多:谢谢你的评论。这是while条件中的一个输入错误……也不相关:您有理由将此
异步无效
而不是
异步任务
?@Fidor是。此方法作为后台线程运行。这是否回答了您的问题@帕夫拉尼霍斯基只是部分。我显然对while循环感到困惑。然而,答案告诉我,我没有充分考虑这一点……;)指向sharpLab的链接非常宝贵!这是一个方便的资源!指向sharpLab的链接非常宝贵!这是一个方便的资源!