C#判斷語(yǔ)句的表達(dá)式樹(shù)實(shí)現(xiàn)
C# 提供了以下類(lèi)型的判斷語(yǔ)句:
語(yǔ)句 | 描述 |
---|---|
if | 一個(gè) if 語(yǔ)句 由一個(gè)布爾表達(dá)式后跟一個(gè)或多個(gè)語(yǔ)句組成。 |
if...else | 一個(gè) if 語(yǔ)句 后可跟一個(gè)可選的 else 語(yǔ)句,else 語(yǔ)句在布爾表達(dá)式為假時(shí)執(zhí)行。 |
嵌套 if 語(yǔ)句 | 您可以在一個(gè) if 或 else if 語(yǔ)句內(nèi)使用另一個(gè) if 或 else if 語(yǔ)句。 |
switch 語(yǔ)句 | 一個(gè) switch 語(yǔ)句允許測(cè)試一個(gè)變量等于多個(gè)值時(shí)的情況。 |
嵌套 switch 語(yǔ) | 您可以在一個(gè) switch 語(yǔ)句內(nèi)使用另一個(gè) switch 語(yǔ)句。 |
當(dāng)然還有 ??
、?:
等判斷,下面將詳細(xì)實(shí)踐。
if
If 語(yǔ)句,使用 IfThen(Expression test, Expression ifTrue);
來(lái)表達(dá)
Expression test
表示用于判斷的表達(dá)式,Expression ifTrue
表示結(jié)果為 true 時(shí)執(zhí)行的表達(dá)式樹(shù)。
示例
int a = 10; int b = 10; if (a == b) { Console.WriteLine("a == b 為 true,語(yǔ)句被執(zhí)行"); } Console.ReadKey();
使用表達(dá)式樹(shù)實(shí)現(xiàn)如下
ParameterExpression a = Expression.Variable(typeof(int), "a"); ParameterExpression b = Expression.Variable(typeof(int), "b"); MethodCallExpression call = Expression.Call( null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), Expression.Constant("a == b 為 true,表達(dá)式樹(shù)被執(zhí)行")); ConditionalExpression _if = Expression.IfThen(Expression.Equal(a, b),call); Expression<Action<int, int>> lambda = Expression.Lambda<Action<int, int>>(_if,a,b); lambda.Compile()(10,10); Console.ReadKey();
生成的表達(dá)式樹(shù)如下
.Lambda #Lambda1<System.Action`2[System.Int32,System.Int32]>( System.Int32 $a, System.Int32 $b) { .If ($a == $b) { .Call System.Console.WriteLine("a == b 為 true,表達(dá)式樹(shù)被執(zhí)行") } .Else { .Default(System.Void) } }
if...else
if...else 使用以下表達(dá)式樹(shù)表示
ConditionalExpression IfThenElse(Expression test, Expression ifTrue, Expression ifFalse);
示例代碼如下
int a = 10; int b = 11; if (a == b) { Console.WriteLine("a == b 為 true,此語(yǔ)句被執(zhí)行"); } else { Console.WriteLine("a == b 為 false,此語(yǔ)句被執(zhí)行"); } Console.ReadKey();
用表達(dá)式樹(shù)實(shí)現(xiàn)如下
ParameterExpression a = Expression.Variable(typeof(int), "a"); ParameterExpression b = Expression.Variable(typeof(int), "b"); MethodCallExpression call1 = Expression.Call( null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), Expression.Constant("a == b 為 true,此表達(dá)式樹(shù)被執(zhí)行")); MethodCallExpression call2 = Expression.Call( null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), Expression.Constant("a == b 為 false,此表達(dá)式樹(shù)被執(zhí)行")); ConditionalExpression _if = Expression.IfThenElse(Expression.Equal(a, b), call1,call2); Expression<Action<int, int>> lambda = Expression.Lambda<Action<int, int>>(_if, a, b); lambda.Compile()(10, 11); Console.ReadKey();
生成的表達(dá)式樹(shù)如下
.Lambda #Lambda1<System.Action`2[System.Int32,System.Int32]>( System.Int32 $a, System.Int32 $b) { .If ($a == $b) { .Call System.Console.WriteLine("a == b 為 true,此表達(dá)式樹(shù)被執(zhí)行") } .Else { .Call System.Console.WriteLine("a == b 為 false,此表達(dá)式樹(shù)被執(zhí)行") } }
switch
示例代碼如下
int a = 2; switch (a) { case 1:Console.WriteLine("a == 1");break; case 2:Console.WriteLine("a == 2");break; default:Console.WriteLine("a != 1 && a = 2"); } Console.ReadKey();
每個(gè) case 使用 SwitchCase 類(lèi)型表示,使用 Expression.SwitchCase 生成 SwitchCase 類(lèi)型。
Expression.Switch 用來(lái)構(gòu)建一個(gè) switch 表達(dá)式樹(shù),
Expression.Switch 的重載比較多,常用的是這種形式
SwitchExpression Switch(Expression switchValue, Expression defaultBody, params SwitchCase[] cases);
switchValue 表示傳入?yún)?shù);
defaultBody 表示 default 執(zhí)行的表達(dá)式;
cases 表示多條 case 。
上面代碼對(duì)應(yīng)使用表達(dá)式樹(shù)編寫(xiě)如下
ParameterExpression a = Expression.Parameter(typeof(int), "a"); MethodCallExpression _default = Expression.Call( null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), Expression.Constant("a != 1 && a = 2")); SwitchCase case1 = Expression.SwitchCase( Expression.Call(null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), Expression.Constant("a == 1")), new ConstantExpression[] { Expression.Constant(1) } ); SwitchCase case2 = Expression.SwitchCase( Expression.Call(null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), Expression.Constant("a == 2")), new ConstantExpression[] { Expression.Constant(2) } ); SwitchExpression _switch = Expression.Switch(a, _default, new SwitchCase[] { case1, case2 }); Expression<Action<int>> lambda = Expression.Lambda<Action<int>>(_switch, a); lambda.Compile()(1); Console.ReadKey();
生成的表達(dá)式樹(shù)如下
.Lambda #Lambda1<System.Action`1[System.Int32]>(System.Int32 $a) { .Switch ($a) { .Case (1): .Call System.Console.WriteLine("a == 1") .Case (2): .Call System.Console.WriteLine("a == 2") .Default: .Call System.Console.WriteLine("a != 1 && a = 2") } }
很奇怪,沒(méi)有 break,但是表達(dá)式樹(shù)是正常的,并且運(yùn)行沒(méi)問(wèn)題;
?? 和 ?:
?? 表示空合并運(yùn)算符,例如 a ?? b
,如果 a 不為 null,即返回 a,否則返回 b;
常用定義如下
BinaryExpression Coalesce(Expression left, Expression right)
這里就不再贅述。
?: 是三元運(yùn)算符,例如 a > b ? a : b 。
常用定義如下
ConditionalExpression Condition(Expression test, Expression ifTrue, Expression ifFalse)
可以參考上面的 if...else 表達(dá)式樹(shù),這里不再贅述。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C#表達(dá)式樹(shù)基礎(chǔ)教程
- C#循環(huán)與循環(huán)控制的表達(dá)式樹(shù)實(shí)現(xiàn)
- C#五類(lèi)運(yùn)算符使用表達(dá)式樹(shù)進(jìn)行操作
- C#使用表達(dá)式樹(shù)(LambdaExpression)動(dòng)態(tài)更新類(lèi)的屬性值(示例代碼)
- C#表達(dá)式樹(shù)講解
- C#使用表達(dá)式樹(shù)實(shí)現(xiàn)對(duì)象復(fù)制的示例代碼
- C#表達(dá)式樹(shù)Expression基礎(chǔ)講解
- C# Lambda表達(dá)式及Lambda表達(dá)式樹(shù)的創(chuàng)建過(guò)程
- C#用表達(dá)式樹(shù)構(gòu)建動(dòng)態(tài)查詢(xún)的方法
- C#表達(dá)式樹(shù)的基本用法講解
- 淺談c#表達(dá)式樹(shù)Expression簡(jiǎn)單類(lèi)型比較demo
- C# 表達(dá)式樹(shù)Expression Trees的知識(shí)梳理
- C#之Expression表達(dá)式樹(shù)實(shí)例
- C#值類(lèi)型、引用類(lèi)型、泛型、集合、調(diào)用函數(shù)的表達(dá)式樹(shù)實(shí)踐
相關(guān)文章
C# menuStrip控件實(shí)現(xiàn)鼠標(biāo)滑過(guò)自動(dòng)彈出功能
MenuStrip 控件是 Visual Studio 和 .NET Framework 中的功能。使用該控件,可以輕松創(chuàng)建 Microsoft Office 中那樣的菜單。本文給大家分享menuStrip鼠標(biāo)滑過(guò)自動(dòng)彈出效果2021-07-07C#調(diào)用百度翻譯API實(shí)現(xiàn)一個(gè)翻譯功能
一直喜歡用Google Translate API進(jìn)行在線(xiàn)翻譯,但是服務(wù)越來(lái)越慢這篇文章,所以只能換一個(gè)了,主要給大家介紹了關(guān)于C#調(diào)用百度翻譯API實(shí)現(xiàn)一個(gè)翻譯功能的相關(guān)資料,需要的朋友可以參考下2021-06-06C#截圖程序類(lèi)似騰訊QQ截圖實(shí)現(xiàn)代碼
拖動(dòng)過(guò)程中顯示當(dāng)前鼠標(biāo)下一小塊的圖像信息 尺寸、顏色信息的 注意 這里顏色是用的ARGB,需要的朋友可以參考下2012-12-12.NET實(shí)現(xiàn):將EXE設(shè)置開(kāi)機(jī)自動(dòng)啟動(dòng)
.NET實(shí)現(xiàn):將EXE設(shè)置開(kāi)機(jī)自動(dòng)啟動(dòng)的方法,需要的朋友可以參考一下2013-03-03