從IL認識關鍵字 二

2022-06-10 12:00:14 字數 2053 閱讀 3707

關鍵字

yield關鍵字。

msdn解釋

yield

關鍵字向編譯器指示它所在的方法是迭代器塊。

編譯器生成乙個類來實現迭代器塊中表示的行為。

在迭代器塊中, yield

關鍵字與 return

關鍵字結合使用,向列舉器物件提供值。

yield

關鍵字也可與 break

結合使用,表示迭代結束。

其實msdn已經解釋清楚,今天我們主要研究第二點,c#會根據yield關鍵字生成乙個類,看看這個類是怎樣的。

c# il code

先從簡單例子看,只有乙個值的迭代器

public

static

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這個就是編譯器生成的乙個類,這段**翻譯成真正的執行**如下

public

static

system.collections.ienumerable yieldonly()

public

d__0(int

<>1__state)

這個就是d_0的建構函式

。那究竟d_0這個類是怎樣的,由於篇幅有限,這裡不全貼出來。有興趣同學自己可以反編譯一下,看看就清楚。它生成時乙個密封類,基礎ienumerable,ienumerator兩個介面,說白了就是乙個迭代器。

[compilergenerated]

private

sealed

class

d__0 : ienumerable, ienumerable, ienumerator, ienumerator, idisposable

下面主要貼出兩個方法解釋。

private

bool

movenext()

return

false

;}

ienumerator ienumerable.getenumerator()

return

new program.d__0(0

);}

初始化放在這裡,這裡不知道為什麼會判斷乙個是不是當前的執行緒,難道它還會跨執行緒呼叫。

迴圈的yield

public

system.collections.ienumerable yieldcycle()

}

對應movenext()

private

bool

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也可以用於在建構函式中呼叫其他建構函式 注意 只能定義在建構函式的第一行,因為初始化...