http://www.7klian.com

C语言中yield要害字的用法详解_链圈子


C语言中的yield要害字是一种用于界说迭代器要领的语法糖,可以简化迭代器的实现,使其越发直观和易于领略。本文将从以下几个方面,,具体先容yield要害字的用法和特点:

  • yield要害字的根基语法
  • yield要害字的事情道理
  • yield要害字的应用场景

yield要害字的根基语法

yield要害字有两种形式:yield return和yield break。它们的浸染别离是:

  • yield return:在迭代中返回一个值,并暂停迭代器的执行,直到下一次迭代请求。
  • yield break:终止迭代,并返回一个空的序列。

yield要害字只能用在返回范例为IEnumerable、IEnumerable<T>、IEnumerator或IEnumerator<T>的要领中,这些要领被称为迭代器要领。迭代器要领不能有任何ref或out参数,也不能位于try-catch块中,但可以位于try-finally的try块中。

以下是一个利用yield return的迭代器要领的示例:

// 生成从0到upto的偶数序列
IEnumerable<int> ProduceEvenNumbers(int upto)
{
    for (int i = 0; i <= upto; i += 2)
    {
        yield return i; // 返回一个偶数,并暂停执行
    }
}

// 利用foreach语句遍历序列
foreach (int i in ProduceEvenNumbers(9))
{
    Console.Write(i);
    Console.Write(" ");
}
// 输出:0 2 4 6 8

以下是一个利用yield break的迭代器要领的示例:

// 生成一个正数序列,直到碰着负数或零为止
IEnumerable<int> TakeWhilePositive(IEnumerable<int> numbers)
{
    foreach (int n in numbers)
    {
        if (n > 0)
        {
            yield return n; // 返回一个正数,并暂停执行
        }
        else
        {
            yield break; // 终止迭代,并返回一个空的序列
        }
    }
}

// 利用foreach语句遍历序列
foreach (int n in TakeWhilePositive(new int[] { 2, 3, 4, 5, -1, 3, 4 }))
{
    Console.Write(n);
    Console.Write(" ");
}
// 输出:2 3 4 5

yield要害字的事情道理

当挪用一个迭代器要领时,并不会当即执行该要领,而是返回一个实现了相应接口的工具,这个工具被称为迭代器。当利用foreach语句可能显式挪用MoveNext要领来遍历迭代器时,才会开始执行迭代器要领的代码,直到碰着第一个yield return语句为止。此时,迭代器要领的执行会暂停,而迭代器的Current属性会返回yield return语句后头的表达式的值。当再次请求下一个元素时,迭代器要领的执行会从上次暂停的处所继承,直到碰着下一个yield return语句可能yield break语句可能要领的末端为止。假如碰着yield break语句可能要领的末端,迭代器的MoveNext要了解返回false,暗示迭代竣事。

可以把yield要害字看作是一种状态机的实现,它可以生存迭代器要领的当前状态,包罗局部变量、参数和节制流程,并在下一次迭代请求时规复这些状态。这样,就可以制止利用显式的荟萃或列举器来存储和返回迭代的功效,从而提高了代码的可读性和机能。

yield要害字的应用场景

yield要害字的一个常见的应用场景是实现延迟执行,即只有在需要的时候才计较和返回功效,而不是一次性计较和返回所有的功效。这样可以节减内存空间,提高运行效率,制止不须要的计较。譬喻,以下代码利用yield要害字实现了一个生成斐波那契数列的迭代器要领:

// 生成斐波那契数列
IEnumerable<int> Fibonacci()
{
    int current = 0;
    int next = 1;
    while (true)
    {
        yield return current; // 返回当前的斐波那契数,并暂停执行
        int temp = next;
        next = current + next;
        current = temp;
    }
}

// 利用foreach语句遍历序列
foreach (int n in Fibonacci())
{
    if (n > 1000) break; // 当斐波那契数大于1000时,终止迭代
    Console.Write(n);
    Console.Write(" ");
}
// 输出:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

在这个例子中,Fibonacci要领并没有一次性计较和返回所有的斐波那契数,而是每次只计较和返回一个斐波那契数,并按照迭代的需求动态调解。这样,就可以制止建设一个无限大的荟萃来存储所有的斐波那契数,也可以制止计较超出需要范畴的斐波那契数。

yield要害字的另一个常见的应用场景是实现自界说的迭代逻辑,即可以按照需要对迭代的功效举办筛选、转换、组合等操纵,而不需要修改原始的数据源或建设新的荟萃。譬喻,以下代码利用yield要害字实现了一个对字符串举办反转的迭代器要领:

// 对字符串举办反转
IEnumerable<char> ReverseString(string str)
{
    for (int i = str.Length - 1; i >= 0; i--)
    {
        yield return str[i]; // 返回字符串的倒数第i个字符,并暂停执行
    }
}

// 利用foreach语句遍历序列
foreach (char c in ReverseString("Hello"))
{
    Console.Write(c);
}
// 输出:olleH

在这个例子中,ReverseString要领并没有修改原始的字符串,也没有建设一个新的字符串,而是每次只返回一个字符,并凭据反转的顺序举办迭代。这样,就可以制止字符串的复制和拼接,提高了代码的简捷性和效率。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。