Что делает «yield break» в C #?

<?php
  function rrmdir($dir) {
  if (is_dir($dir)) {
    $objects = scandir($dir);
    foreach ($objects as $object) {
      if ($object != "." && $object != "..") {
        if (filetype($dir."/".$object) == "dir") 
           rrmdir($dir."/".$object); 
        else unlink   ($dir."/".$object);
      }
    }
    reset($objects);
    rmdir($dir);
  }
 }
?>

Попробуйте выставить код из php.net

Работайте со мной отлично

458
задан Zach Saucier 2 July 2016 в 00:09
поделиться

7 ответов

Это определяет, что итератор закончился. Можно думать yield break как return оператор, который не возвращает значение.

, Например, если Вы определяете функцию как итератор, тело функции может быть похожим на это:

for (int i = 0; i < 5; i++)
{
    yield return i;
}

Console.Out.WriteLine("You will see me");

Вексель, что после того, как цикл завершил все свои циклы, последняя строка, оформлен, и Вы будете видеть сообщение в своем консольном приложении.

Или как это с yield break:

int i = 0;
while (true)
{
    if (i < 5)
    {
        yield return i;
    }
    else
    {
        // note that i++ will not be executed after this
        yield break;
    }
    i++;
}

Console.Out.WriteLine("Won't see me");

В этом случае последний оператор никогда не выполняется, потому что мы оставили функцию рано.

496
ответ дан g t 2 July 2016 в 00:09
поделиться
  • 1
    Да, that' s превосходный пример когда и как использовать транзакцию. – Cylon Cat 28 June 2009 в 16:28

Заканчивает блок итератора (например, говорит, что больше нет элементов в IEnumerable).

53
ответ дан Brian 2 July 2016 в 00:09
поделиться

Говорит итератору, что он достиг конца.

Как пример:

public interface INode
{
    IEnumerable<Node> GetChildren();
}

public class NodeWithTenChildren : INode
{
    private Node[] m_children = new Node[10];

    public IEnumerable<Node> GetChildren()
    {
        for( int n = 0; n < 10; ++n )
        {
            yield return m_children[ n ];
        }
    }
}

public class NodeWithNoChildren : INode
{
    public IEnumerable<Node> GetChildren()
    {
        yield break;
    }
}
29
ответ дан Trap 2 July 2016 в 00:09
поделиться

Целый предмет блоков итератора покрыт хорошо в этом глава бесплатного образца из книги Jon Skeet C# подробно .

11
ответ дан Michael Fredrickson 2 July 2016 в 00:09
поделиться

Если, что Вы подразумеваете, "что действительно приводит к повреждению действительно, делают", "как делает оно работает" - Видят блог Raymond Chen для деталей http://blogs.msdn.com/oldnewthing/archive/2008/08/12/8849519.aspx

, итераторы C# генерируют некоторый очень сложный код.

4
ответ дан Tony Lee 2 July 2016 в 00:09
поделиться

yield в основном заставляет метод IEnumerable вести себя аналогично кооперативному (а не вытесняющему) запланированному потоку.

yield return похож на поток, вызывающий функцию «расписание» или «сна», чтобы отказаться от управления процессором. Подобно потоку, метод IEnumerable восстанавливает элементы управления в точке сразу после этого, при этом все локальные переменные имеют те же значения, что и до того, как управление было прекращено.

yield break подобен потоку, достигающему конца своей функции и завершающемуся.

Люди говорят о «конечном автомате», но конечный автомат - это все, что «поток» на самом деле является. У потока есть некоторое состояние (т.е. значения локальных переменных), и каждый раз, когда он запланирован, он предпринимает некоторые действия, чтобы перейти в новое состояние. Ключевым моментом в yield является то, что, в отличие от потоков операционной системы, к которым мы привыкли, код, который его использует, замораживается во времени до тех пор, пока итерация не будет продвинута вручную или завершена вручную.

20
ответ дан 22 November 2019 в 22:52
поделиться

Здесь http://www.alteridem.net/2007/08/22/the-yield-statement-in-c/ - очень хороший пример:

public static IEnumerable<int> Range( int min, int max )
{
   while ( true )
   {
      if ( min >= max )
      {
         yield break;
      }
      yield return min++;
   }
}

и пояснение, что если В методе сработал оператор yield break , выполнение этого метода останавливается без возврата. Бывают ситуации, когда вы не хотите давать никакого результата, тогда вы можете использовать yield break.

7
ответ дан 22 November 2019 в 22:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: