C#循環(huán)與循環(huán)控制的表達式樹實現(xiàn)_第1頁
C#循環(huán)與循環(huán)控制的表達式樹實現(xiàn)_第2頁
C#循環(huán)與循環(huán)控制的表達式樹實現(xiàn)_第3頁
C#循環(huán)與循環(huán)控制的表達式樹實現(xiàn)_第4頁
C#循環(huán)與循環(huán)控制的表達式樹實現(xiàn)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

第C#循環(huán)與循環(huán)控制的表達式樹實現(xiàn)C#提供了以下幾種循環(huán)類型。

循環(huán)類型描述while循環(huán)當給定條件為真時,重復語句或語句組。它會在執(zhí)行循環(huán)主體之前測試條件。for/foreach循環(huán)多次執(zhí)行一個語句序列,簡化管理循環(huán)變量的代碼。do...while循環(huán)除了它是在循環(huán)主體結(jié)尾測試條件外,其他與while語句類似。嵌套循環(huán)您可以在while、for或do..while循環(huán)內(nèi)使用一個或多個循環(huán)。

當然,還有以下用于控制循環(huán)的語句

控制語句描述break語句終止loop或switch語句,程序流將繼續(xù)執(zhí)行緊接著loop或switch的下一條語句。continue語句引起循環(huán)跳過主體的剩余部分,立即重新開始測試條件。

LabelTarget

LabelTarget是用于創(chuàng)建循環(huán)標記的。

無論是for還是while,平時編寫循環(huán)時,都需要有跳出循環(huán)的判斷,有時需要某個參數(shù)自增自減并且作為判斷依據(jù)。

C#表達式樹里面是沒有專門表示for/while的,里面只有一個Loop??匆幌翷oop生成的表達式樹

.Lambda#Lambda1System.Func`1[System.Int32](){

.Block(System.Int32$x){

$x=0;

.Loop{

.If($x10){

$x++

}.Else{

.Break#Label1{$x}

.LabelTarget#Label1:

}

要實現(xiàn)循環(huán)控制,有break,contauine兩種Expression:

publicstaticGotoExpressionBreak(LabelTargettarget,Typetype);

publicstaticGotoExpressionBreak(LabelTargettarget,Expressionvalue);

publicstaticGotoExpressionBreak(LabelTargettarget);

publicstaticGotoExpressionBreak(LabelTargettarget,Expressionvalue,Typetype);

publicstaticGotoExpressionContinue(LabelTargettarget,Typetype);

publicstaticGotoExpressionContinue(LabelTargettarget);

所以,要實現(xiàn)循環(huán)控制,必須要使用LabelTarget,不然就無限循環(huán)了。

要理解LabelTarget,最好的方法是動手做。

for/while循環(huán)

Expression.Loop用于創(chuàng)建循環(huán),包括for和while,定義如下

publicstaticLoopExpressionLoop(Expressionbody,LabelTarget@break,LabelTarget@continue);

System.Linq.Expressions.LoopExpression.

publicstaticLoopExpressionLoop(Expressionbody);

publicstaticLoopExpressionLoop(Expressionbody,LabelTarget@break);

表達式樹里面的循環(huán),只有Loop,無for/while的區(qū)別。

那么,我們來一步步理解Loop循環(huán)和LabelTarget;

while(true)

Console.WriteLine("無限循環(huán)");

}

那么,對應的Loop重載是這種

publicstaticLoopExpressionLoop(Expressionbody)

使用表達式樹編寫

BlockExpression_block=Expression.Block(

newParameterExpression[]{},

Expression.Call(null,typeof(Console).GetMethod("WriteLine",newType[]{typeof(string)}),Expression.Constant("無限循環(huán)"))

LoopExpression_loop=Expression.Loop(_block);

ExpressionActionlambda=Expression.LambdaAction(_loop);

lambda.Compile()();

最簡單的循環(huán)

如果我想用表達式樹做到如下最簡單的循環(huán),怎么寫?

while(true)

Console.WriteLine("我被執(zhí)行一次就結(jié)束循環(huán)了");

break;

}

表達式樹編寫

LabelTarget_break=Expression.Label();

BlockExpression_block=Expression.Block(

newParameterExpression[]{},

Expression.Call(null,typeof(Console).GetMethod("WriteLine",newType[]{typeof(string)}),Expression.Constant("我被執(zhí)行一次就結(jié)束循環(huán)了")),Expression.Break(_break));

LoopExpression_loop=Expression.Loop(_block,_break);

ExpressionActionlambda=Expression.LambdaAction(_loop);

lambda.Compile()();

Console.ReadKey();

生成的表達式樹

.Lambda#Lambda1System.Action(){

.Loop{

.Block(){

.CallSystem.Console.WriteLine("我被執(zhí)行一次就結(jié)束循環(huán)了");

.Break#Label1{}

.LabelTarget#Label1:

}

首先要明確,Expression.Label()里面可以為空,它是一種標記,不參與傳遞參數(shù),不參與運算。有參無參,前后保持一致即可。

但是上面的循環(huán)只有一次,你可以將上面的標簽改成這樣試試LabelTarget_break=Expression.Label(typeof(int));,原因后面找。

還有,Expression.Label()變量需要一致,否則無法跳出。

試試一下代碼

BlockExpression_block=Expression.Block(

newParameterExpression[]{},

Expression.Call(null,typeof(Console).GetMethod("WriteLine",newType[]{typeof(string)}),Expression.Constant("我被執(zhí)行一次就結(jié)束循環(huán)了")),Expression.Break(Expression.Label()));

LoopExpression_loop=Expression.Loop(_block,Expression.Label());

ExpressionActionlambda=Expression.LambdaAction(_loop);

lambda.Compile()();

Console.ReadKey();

里面用到了Expression.Block(),Block()是塊,即{}。

如果Block()是在最外層,那么相當于是函數(shù);如果是內(nèi)嵌,相當于{};

但不是真的這樣。。。表達式樹里面不是完全按照C#的語法來還原操作的。

對于Block()的使用,多加實踐即可。

寫一個循環(huán)十次的循環(huán)語句

for(inti=0;ii++)

if(i10)

Console.WriteLine(i);

else

break;

}

或者使用while表示

inti=0;

while(true)

if(i10)

Console.WriteLine(i);

else

break;

i++;

}

使用表達式樹編寫

LabelTarget_break=Expression.Label(typeof(int));

ParameterExpressiona=Expression.Variable(typeof(int),"a");

BlockExpression_block=Expression.Block(newParameterExpression[]{},

Expression.IfThenElse

Exp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論