国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

C# 2.0 Specification(迭代器)(一)

2024-07-21 02:20:07
字體:
來源:轉載
供稿:網友


22迭代器
22.1迭代器塊
迭代器塊就是產生值的有序序列的語句塊。迭代器塊通過一個或多個yield語句區別于常規語句塊。

l yield return 語句產生迭代的下一個值。

l yield break 語句指明迭代完成。

迭代器塊可以被用作一個方法體(method-body)、運算符體(operator-body)、訪問器體(accessor-body),前提是對應函數成員的返回類型是枚舉器(enumerator)接口之一或者可枚舉(enumerable)接口之一。

迭代器塊在c#語法中不什么獨特的元素。它們在幾個方面受到限制,并且主要的作用在函數成員聲明的語義上,但它們在語法上只是語句塊而已。

當一個函數成員使用迭代器塊實現時,對于正式參數列表指定任何ref或out參數將導致編譯時錯誤。

return語句出現在迭代器塊中將導致編譯時錯誤(但yield return語句是允許的)。

在迭代器塊中包含不安全上下文(§18.1)將導致編譯時錯誤。即使是當迭代器聲明內嵌在不安全上下文中,迭代器塊也總是定義為一個安全上下文。

22.1.1枚舉器接口
枚舉器接口(enumerator interface)是system.collections.ienumerator接口以及system.collections.generic.ienumerator<t>的所有實例。在本章,這些接口將相應地作為ienumerator和ienumerator<t>而引用。

22.1.2可枚舉接口
可枚舉接口(enumerable interface)是system.collections.ienumerable接口和system.collections.generic.ienumerable<t>的所有實例。在本章,這些接口將相應地作為ienumerable和ienumerable<t>而被引用。





22.1.3yield 類型
迭代器塊生成具有相同類型的所有值的序列。給類型被稱為迭代器塊的yield類型(yield type)。

l 迭代器塊的yield類型通常用于實現返回ienumerator或ienumerable是對象的函數成員。

l 迭代器塊的yield類型通常用于實現返回ienumerator<t>或ienumerable<t>是t的函數成員。

22.1.4 this 訪問
在類的實例成員的迭代器塊內,this表達式被歸類為值。該值的類型就是類類型,在這個類型可以采用這種用法,這個值就是成員被調用時的對象的引用。

在結構的實例成員的迭代器塊內,this表達時被歸類作為一個變量。該變量的類型就是結構類型,在這個結構中它可以采用這種用法。該變量表示一個成員被調用時的對應結構的一個拷貝。在結構實例成員的迭代器塊內,this變量的行為就好像是結構類型的一個值參數。

22.2枚舉對象
當返回枚舉器接口類型的函數成員使用迭代器塊實現時,調用函數成員并不會立即執行迭代器塊中的代碼。相反,枚舉器對象(enumerator object)將被創建和返回。該對象封裝了在迭代器塊中指定的代碼,當枚舉器對象的movenext方法被調用時,迭代器塊中的代碼就會執行。枚舉器對象有如下的特征。

l 它實現了ienumerator和ienumerator<t>,t是迭代器塊的yield類型(產生類型)。

l 它實現了system.idisposable。







l 它被使用實參值(如果有的話)的拷貝而初始化,而實例值將被傳遞給函數成員。

l 它有四個潛在的狀態before、running、suspended和after,并且它在before狀態之前被初始化。



枚舉器對象通常是一個編譯器生成的枚舉器類實例,它封裝了迭代器語句塊中的代碼,并且實現了枚舉器接口,但其它實現方法也是可以的。如果一個枚舉器類是由編譯器生成的,這個類將會是內嵌的,在包含函數成員的類中,類將具有私有可訪問性,并且該類具有一個保留為編譯器所用的名字(§2.4.2)。

枚舉器對象可以實現比在此指定的更多接口。

隨后幾節描述了由ienumerable和ienumerable<t>接口實現的movenext、current、和dispose成員的確切行為,這兩個接口由枚舉對象提供。

請注意,枚舉器對象并不支持ienumerator.reset方法。調用該方法將會拋出system.notsupportedexception異常。

22.2.1movenext方法
枚舉器對象的movenext方法封裝了迭代器塊的代碼。調用movenext方法將執行迭代器內的代碼,并將枚舉對象的current屬性設置為合適的值。由movenext方法執行的精確動作,取決于當movenext方法被調用時枚舉器對象的狀態。

l 如果枚舉器對象狀態是before,調用movenext

n 將把狀態改為running。

n 將把迭代器塊的參數(包括this)初始化為,當枚舉器對象被初始化而保存的實參值和實例值。

n 從開始執行迭代器塊直到執行被中斷(如下面所描述的)。

l 如果枚舉器對象的狀態是running,調用movenext的結果是未指定的。

l 如果枚舉器對象的狀態是suspended,調用movenext

n 將把狀態改為running。





l 恢復所有局部變量和參數(包括this)的值為迭代器最后一次掛起(suspended)時執行狀態的值。請注意,由這些變量所引用的任何對象的內容,都可能因為前一次對movenext的調用而改變。

n 在引發執行掛起的yield return 語句之后重新開始執行迭代器塊,并且這個狀態會繼續直到執行被中斷(如下所描述)。

l 如果枚舉器對象的狀態是after,那么調用movenext將返回false。

當movenext執行迭代器塊時,有四種方法可以中斷執行:通過一個yield return 語句,通過一個yield break語句,到達迭代器塊的結束點,以及一個異常被拋出,并被傳播到迭代器塊之外。

l 當遇到一個yield return 語句時(§22.4),將會發生如下情況

n 在該語句中被給定的表達式將被計算,隱式地轉換到產生類型(yield type),并被賦值給枚舉對象的current屬性。

n 迭代器體的執行將被掛起。所有局部變量的值和參數(包括this)被保存,該yield return 語句的位置也被保存。如果yield return 語句在一個或多個try塊之內,與之關聯的finally塊在此時將不會執行。

n 枚舉器對象的狀態被改為suspended。

n movenext方法對調用方返回true,表明迭代器成功前進到下一個值。

l 當遇到yield break 語句時,將會發生如下情況

n 如果yield break 語句在一個或多個try塊之內,與之關聯的finally語句將被執行。

n 枚舉器對象的狀態被改為after。

n movenext方法對調用方返回false,表明迭代已經完成。

l 當遇到迭代器塊的結束點時,將會發生如下情況。

n 枚舉器對象的狀態被改為after。

n movenext方法對調用方返回false,表明迭代已經完成。





l 當一個異常被拋出并被傳播到迭代器塊之外時,將會發生如下情況。

n 在迭代器塊之內將會由于異常傳播(exception propagation)而執行合適的finally塊。

n 枚舉器對象的狀態被改為after。

n 對于movenext方法的調用方來說,異常傳播將會繼續。

22.2.2 current屬性
枚舉器對象的current屬性受到迭代器塊的yield return 語句的影響。

當枚舉器對象處于suspended狀態時,current的值就是最后一次調用movenext時被設置的值。當枚舉器對象處于before、running或after狀態時,訪問current的所得結果是未指定的。

對于一個具有非object類型的yield 類型迭代器塊,通過枚舉器對象的ienumerable實現訪問current所得實現,對應于通過枚舉器對象的ienumerator<t>訪問current所得實現,并將結果轉換到object類型。

22.2.3 dispose方法
dispose方法通過將枚舉器對象的狀態置為after,以清理迭代結果。

l 如果枚舉器對象的狀態是before,調用dispose將改變其狀態為after。

l 如果枚舉器對象的狀態是running,調用dispose的結果是為指定的。

l 如果枚舉器對象的狀態是suspended,調用dispose將

n 改變其狀態為running。

n 執行finally塊,就好像最后執行的yield return語句是一個yield break語句。如果這里引發一個異常被拋出并傳播到迭代器體之外,枚舉器對象的狀態將被置為after,并且該異常將被傳播給dispose方法的調用方。

n 改變其狀態為after。

l 如果枚舉器對象的狀態為after,調用dispose沒有效果。



22.3可枚舉對象
當返回一個可枚舉接口類型的函數成員使用迭代器塊實現時,調用函數成員不會立即執行迭代器塊代碼。相反,一個可枚舉對象(enumerable object)將被創建并返回。可枚舉對象的getenumerator方法返回一個枚舉器對象,它封裝了在迭代器塊中指定的代碼,當枚舉器對象的movenext方法被調用時,將觸發迭代器塊代碼的執行。可枚舉對象具有如下特征。

l 它實現了ienumerable和ienumerable<t>接口,這里t是迭代器塊的產生類型(yield type)。

l 它使用實參值的拷貝進行初始化(如果有的話),并將實例值傳遞給函數成員。



可枚對象通常是一個由編譯器生成的可枚舉類的實例,該類封裝了迭代器塊的代碼,并實現了可枚舉接口,但其他實現方法也是可以的。如果可枚舉類由編譯器生成,該類將內嵌在包含函數成員的類中,并具有私有可訪問性,以及一個為編譯器所保留使用的名字(§2.4.2)。

可枚對象可以實現比在此說明的更多接口。特別的是,可枚舉對象也可以實現ienumerator和ienumerator<t>接口,這使得它既可以作為一個可枚舉對象又可作為枚舉器對象。在那個實現類型中,對可枚舉對象的getenumerator方法的首次調用,將返回可枚舉對象自身。對于該可枚舉對象的getenumerator方法的后續調用,如果有的話,將會返回可枚舉對象的一個拷貝。因此,每次返回的枚舉器將有它自己的狀態,并且在一個枚舉器中所作的改變不會影響另一個枚舉器。

22.3.1 getenumerator方法
可枚舉對象提供了ienumerable和ienumerable<t>接口的getenumerator方法的一個實現。這兩個getenumerator方法共享一個公共實現,它是用來得到并返回一個有效的枚舉器對象。

枚舉器對象使用實參值進行初始化,當可枚舉對象被初始化時其實例值將被保存,另一方面,枚舉器對象函數將如§22.2所描述。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 元氏县| 绩溪县| 长兴县| 忻城县| 华安县| 蒙自县| 贺兰县| 安陆市| 区。| 师宗县| 怀集县| 湛江市| 湘潭县| 蒙山县| 衢州市| 新建县| 阿克陶县| 封开县| 朔州市| 阜新| 金山区| 舒城县| 桑植县| 和静县| 江源县| 诸城市| 台中市| 通渭县| 富蕴县| 蒲江县| 明星| 沙田区| 郸城县| 都昌县| 镇雄县| 乾安县| 海门市| 张家口市| 临沂市| 澄迈县| 临沂市|