c 中的yield關鍵字

2021-06-22 12:43:32 字數 1924 閱讀 6773

原文:

今天講到迭代器,對迭代器中yield關鍵字做了研究。

說起yield,不得不先說說迭代器。

迭代器是c# 2.0中的新功能,有了它,我們就可以在自己的類或者結構中支援foreach迭代而不必實現整個ienumerable介面,我們只需要提供乙個迭代器,即可遍歷類中的資料結構。當編譯器檢測到迭代器時,它將自動生成ienumerable介面的current、movenext和dispose方法。

而迭代器**使用yield return語句依次返回每個元素。yield break將中止迭代。到達yield return語句時,會儲存當前迭代的位置,下次呼叫迭代器時將從此位置開始執行。

在下面的示例中,迭代器塊(這裡是方法power(int number, int power))中使用了 yield 語句。當呼叫 power 方法時,它返回乙個包含數字冪的可列舉物件。注意 power 方法的返回型別是 ienumerable(一種迭代器介面型別)。

// yield-example.cs

usingsystem;

usingsystem.collections;

publicclasslist

}staticvoidmain()

", i);}}

}yield

關鍵字yield:在迭代器塊中用於向列舉數物件提供值或發出迭代結束訊號。迭代器塊有兩個特殊語句:

●yield return ;

●yield break;

迭代器塊

迭代器塊是有乙個或多個yield語句的**塊。下面三種型別的**塊中的任意一種都可以是迭代器塊:

■方法主體

■訪問器主體

■運算子主體

yield語句只能出現在迭代器塊中,該塊可用作方法、運算子或訪問器的體。這類方法、運算子或訪問器的體受以下約束的控制:

■不允許不安全塊。

■方法、運算子或訪問器的引數不能是 ref 或 out。

■yield語句不能出現在匿名方法中。

■yield return語句不能出現在catch 塊中或含有乙個或多個catch子句的try塊中。

yield語句的迭代塊可以產生ienumerator和ienumerable兩種物件:

★ienumerable物件:

public ienumerablegetints()

使用示例:直接作用在foreach語句中

foreach (int i in getints())

★ienumerator物件:

public ienumeratorgetenumerator()//注意方法名

使用示例1:無法直接用於foreach語句,獲取迭代器的方法名可任意選擇,如myenumerator().

integers ints = new integers();//integers是getenumerator()方法所在的類。

ienumeratorenumerator = ints.getenumerators();

while (enumerator.movenext())

使用示例2:可以作用於foreach語句,但是是方法所在的類用在foreach語句中,並且必須使用getenumerator作為獲取迭代器的方法名。

integers ints = new integers();//integers是getenumerator()方法所在的類。

foreach (int i in ints)

ps:幾乎所有的對yield return和直接return list的測試結果都會告訴你,yield return更慢。但是當你真正了解yield之後,相信多數情況下都會選擇yield return的。

C 中yield關鍵字

yield關鍵字向編譯器指示它所在的方法是迭代器塊。編譯器生成乙個類來實現迭代器塊中標的行為。在迭代器中,yieid關鍵字與return關鍵字結合使用,向列舉器物件提供值。這是乙個返回值,例如,在foreach語句的每一次迴圈中返回的值。yieid關鍵字也可與break結合使用,表示迭代結束。usi...

C 中的yield關鍵字

yield 關鍵字yield 在迭代器塊中用於向列舉數物件提供值或發出迭代結束訊號。迭代器塊有兩個特殊語句 yield return yield break 迭代器塊 迭代器塊是有乙個或多個yield語句的 塊。下面三種型別的 塊中的任意一種都可以是迭代器塊 方法主體 訪問器主體 運算子主體 yie...

C 中的yield關鍵字

迭代器,是乙個連續的集合,出現多個yield return其實就是將這多個的yield return元素按照出現的順序儲存在迭代器的集合中而已。形如下面的形式 public class citycollection ienumerable ienumerator ienumerable.getenu...