關鍵字
yield關鍵字。
msdn解釋
yield
關鍵字向編譯器指示它所在的方法是迭代器塊。
編譯器生成乙個類來實現迭代器塊中表示的行為。
在迭代器塊中, yield
關鍵字與 return
關鍵字結合使用,向列舉器物件提供值。
yield
關鍵字也可與 break
結合使用,表示迭代結束。
其實msdn已經解釋清楚,今天我們主要研究第二點,c#會根據yield關鍵字生成乙個類,看看這個類是怎樣的。
c# il code
先從簡單例子看,只有乙個值的迭代器
publicstatic
ienumerable test()
對應的il
.maxstack 2.locals init (
[0] class yield.program/
d__0 d__,
[1] class
[mscorlib]system.collections.ienumerable enumerable)
l_0000: ldc.i4.s -2
l_0002: newobj instance
void yield.program/d__0::.ctor(int32)
l_0007: stloc.
0l_0008: ldloc.
0l_0009: stloc.
1l_000a: br.s l_000c
l_000c: ldloc.
1l_000d: ret
d_0這個就是編譯器生成的乙個類,這段**翻譯成真正的執行**如下
publicstatic
system.collections.ienumerable yieldonly()
publicd__0(int
<>1__state)
這個就是d_0的建構函式
。那究竟d_0這個類是怎樣的,由於篇幅有限,這裡不全貼出來。有興趣同學自己可以反編譯一下,看看就清楚。它生成時乙個密封類,基礎ienumerable,ienumerator兩個介面,說白了就是乙個迭代器。
[compilergenerated]private
sealed
class
d__0 : ienumerable, ienumerable, ienumerator, ienumerator, idisposable
下面主要貼出兩個方法解釋。
privatebool
movenext()
return
false
;}
ienumerator ienumerable.getenumerator()return
new program.d__0(0
);}
初始化放在這裡,這裡不知道為什麼會判斷乙個是不是當前的執行緒,難道它還會跨執行緒呼叫。
迴圈的yield
publicsystem.collections.ienumerable yieldcycle()
}
對應movenext()
privatebool
movenext()
break
;
case1:
goto
label_004b;
}return
false;}
迴圈語句基本分為兩個模組,乙個迭代的部分,乙個是疊加的部分。對於有判斷條件的yield return的,會將疊加部分拆分。
再次認識this關鍵字
1 定義乙個cat類,如下 public class cat public string getname public void setname string name public string getcolor public void setcolor string color 2 測試類 pu...
new關鍵字 this關鍵字 base關鍵字
使用new,所做的三件事 1.類是引用物件,引用物件是在堆中開闢空間 在堆中開闢空間 2.在開闢的堆空間中建立物件 3.呼叫物件的構建函式 4.隱藏父類成員 子類的成員可以與隱藏從父類繼承的成員,類似於重寫。public new void sayhello this關鍵字的使用 1.代表當前類的物件...
this關鍵字 static關鍵字
1.當成員變數和區域性變數重名,可以用關鍵字this來區分 this 代表物件,代表那個物件呢?當前物件 this就是所在函式所屬物件的引用 簡單說 那個物件呼叫了this所在的函式,this就代表哪個物件 this也可以用於在建構函式中呼叫其他建構函式 注意 只能定義在建構函式的第一行,因為初始化...