C# 函数return是否中断循环,并在内存中处理变量?

C# 函数return是否中断循环,并在内存中处理变量?,c#,function,foreach,return,break,C#,Function,Foreach,Return,Break,如果您正在编写带有返回值的函数,并且在其中一个代码路径上有foreach,“return”是否也执行“break”?这个有点不同,因为它有嵌套的循环 这就是我正在谈论的特定片段。如果符合任何标准,我只想退出: protected bool SearchMultiples(decimal i) { bool bl = false; foreach (var sl in ht.Values) { foreach (var v in al) {

如果您正在编写带有返回值的函数,并且在其中一个代码路径上有foreach,“return”是否也执行“break”?这个有点不同,因为它有嵌套的循环

这就是我正在谈论的特定片段。如果符合任何标准,我只想退出:

protected bool SearchMultiples(decimal i)
{
    bool bl = false;
    foreach (var sl in ht.Values)
    {
        foreach (var v in al)
        {
            if (decimal.Parse(v.ToString()) > i)
            {
                break;
            }
            else
            {
                if (v.ToString() == i.ToString())
                {
                    return true;
                }
            }
        }
    }
    return bl;
}
我做了一些搜索,但没有找到像这样的东西。我能找到的最接近的东西是有人建议使用for循环,但这仍然不能回答问题。我知道该语句将返回代码块中该点出现的任何值,但它是否会在内存中处理其数据并停止运行

为什么这对我很重要? 我第一次尝试多线程。该应用程序是一个质数查找程序。如果大数是较小素数的倍数,则此狙击旨在消除大数。当我找到一个素数时,我只为该素数创建一个新的类型化列表,然后用p=prime(pn1,pn2,p*n3…)填充该列表。 我必须为每个素数创建一个列表,因为我发现在一个键入的列表中不能存储超过2GB的信息。 然后,每个列表作为字典项进入哈希表。
基本算法仍然很初级,但我正在努力添加除法的所有快捷规则以加快运算速度。

是的,从方法返回也将退出for循环。编写一个简单的测试来验证……

应该相当容易,当您点击一个return语句时,函数会完成,通常情况下,return语句之后的代码不会执行。使用try、catch、finally块时会出现异常,finally块中的代码将始终运行

只是给你一个关于引擎盖下发生了什么的提示。C#被编译为本机代码:

在执行CLI程序集时,其代码将通过运行时的JIT编译器来生成本机代码。也可以使用提前编译,这消除了此步骤,但以可执行文件的可移植性为代价

因此,您的源(条件)被编译为如下内容:

IL_0010:  ldloca.s 2
IL_0012:  constrained. [mscorlib]System.Int32
IL_0018:  callvirt instance string object::ToString()
IL_001d:  call valuetype [mscorlib]System.Decimal valuetype [mscorlib]System.Decimal::Parse(string)
IL_0022:  ldloc.1 
IL_0023:  call valuetype [mscorlib]System.Decimal valuetype [mscorlib]System.Decimal::op_Implicit(int32)
IL_0028:  call bool valuetype [mscorlib]System.Decimal::op_GreaterThan(valuetype [mscorlib]System.Decimal, valuetype [mscorlib]System.Decimal)
IL_002d:  brfalse IL_0037
因此,如果条件失败,程序将转到“else”分支(从IL_0032开始)

IL_0032:  br IL_0068
否则它将中断循环->跳到
il0068
,这是foreach之后的第一条指令。因此,break只是转到循环之后的第一条指令

IL_0037:  ldloca.s 2
IL_0039:  constrained. [mscorlib]System.Int32
IL_003f:  callvirt instance string object::ToString()
IL_0044:  ldloca.s 1
IL_0046:  constrained. [mscorlib]System.Int32
IL_004c:  callvirt instance string object::ToString()
IL_0051:  call bool string::op_Equality(string, string)
IL_0056:  brfalse IL_005d

IL_005b:  ldc.i4.1 
IL_005c:  ret 
ldc.i4.1
ret
一起使
返回true
ret
定义如下:

从方法返回,可能带有值


因此,除非有例如
finally
块仍在等待进程,否则函数将立即返回。

那么,您是否尝试观察发生了什么?
return
将控制权从当前方法/过程转移到调用者。因此,是的,它也会打破当前方法中对流结构的所有控制。(好吧,除了一个
尝试..我想最后是
)事实上并非完全正确。例如,如果它在try/finally块中,finally块将在它之后运行。是的,你是正确的。很好的澄清。虽然正确且信息丰富,但在我看来,在这种情况下,简短的答案更好。对于提出如此琐碎问题的人来说,你的答案太多了重申。@Zoharpeld我同意,如果还没有一个简单的答案,我会发布一个简单的…但我的目的是提供额外的(我觉得很有趣)OP和其他人可能感兴趣,也可能不感兴趣的信息。我正在处理的数字超出了.NET framework的设计范围。更不用说处理多个线程了,每个线程都在处理一系列的倍数、除法或平方根,这让我的计算机内存变得相当复杂内存占用如此之快(16GB),我开始怀疑内置内存管理,但我想在这方面获得一些信息。