Когда я должен использовать возвращаемый доход и когда я должен использовать возврат только?
Когда использовать Доход?
Ответ 1
Конструкция yield
используется для создания итератора, который может последовательно создавать несколько значений:
IEnumerable<int> three_numbers() {
yield return 1;
yield return 2;
yield return 3;
}
...
foreach (var i in three_numbers()) {
// i becomes 1, 2 and 3, in turn.
}
Ответ 2
Используйте выход, когда вы возвращаете перечислимое значение, и у вас нет всех результатов в этой точке.
Практически, я использовал выход, когда хочу перебирать большой блок информации (база данных, плоский файл и т.д.), и я не хочу сначала загружать все в памяти. Выход - это хороший способ перебирать блок, не загружая все сразу.
Ответ 3
Выход для итераторов.
Он позволяет обрабатывать список в маленьких ласточках, что хорошо для больших списков.
Волшебная вещь о доходе - это то, что она запоминает, где вы находитесь между вызовами.
Если вы не итерируете, вам не нужен выход.
Ответ 4
Ключевое слово yield
невероятно мощное. Он в основном позволяет быстро возвращать объекты IEnumerable
и IEnumerator
без явно их кодирования.
Рассмотрим сценарий, в котором вы хотите вернуть пересечение двух объектов IEnumerable. Вот как вы это сделаете, используя ключевое слово yield.
public static class Program
{
public static void Main()
{
IEnumerable<object> lhs = new List<int> { 1, 2, 3, 4, 5 };
IEnumerable<object> rhs = new List<int> { 3, 4, 5, 6, 7 };
foreach (object item in IntersectExample.Intersect(lhs, rhs))
{
Console.WriteLine(item);
break;
}
}
}
public static class IntersectExample
{
public static IEnumerable<object> Intersect(IEnumerable<object> lhs, IEnumerable<object> rhs)
{
var hashset = new HashSet<object>();
foreach (object item in lhs)
{
if (!hashset.Contains(item))
{
hashset.Add(item);
}
}
foreach (object item in rhs)
{
if (hashset.Contains(item))
{
yield return item;
}
}
}
}
Трудно это оценить, пока вы не поймете, что происходит. Обычно, когда вы пересекаете два набора, вы завершаете всю операцию, прежде чем возвращать результат вызывающему. Средством выполнения операции является O(m + n)
, где m
и n
- это размеры пересекаемых коллекций, независимо от того, что вы делаете с результатом впоследствии. Но в моем примере я просто хотел отбирать первый элемент из результата. Использование IEnumerable
, созданное ключевым словом yield
, позволяет легко отложить часть обработки до тех пор, пока она не понадобится. Мой пример работает в O(m)
. Альтернативой является кодирование IEnumerable
и сохранение состояния в нем вручную. Сила ключевого слова yield
заключается в том, что он создает для вас этот конечный автомат.
Ответ 5
Возврат дохода продолжит метод с этой точки. Например, вы хотите перебирать массив или список и возвращать каждый элемент в то время, когда вызывающий процесс обрабатывается. Таким образом, вы будете использовать доходность возврата. Если вы хотите вернуть все и затем сделать, вам не нужно это делать
Ответ 6
Здесь объясняется:
Справочник по языку С#
yield (ссылка С#)
Вызываемый метод возвращает каждое отдельное значение, чтобы вызывающий вызывал его.
Это означает, что вам нужно будет использовать доход, если вы хотите получить все возможные результаты, возвращенные итерацией.