服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#判断语句的表达式树实现

C#判断语句的表达式树实现

2022-12-20 14:59痴者工良 C#

这篇文章介绍了C#判断语句的表达式树实现,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

C# 提供了以下类型的判断语句:

语句 描述
if 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。
if...else 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。
嵌套 if 语句 您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。
switch 语句 一个 switch 语句允许测试一个变量等于多个值时的情况。
嵌套 switch 语 您可以在一个 switch 语句内使用另一个 switch 语句。

当然还有 ???: 等判断,下面将详细实践。

if

If 语句,使用 IfThen(Expression test, Expression ifTrue); 来表达

Expression test表示用于判断的表达式,Expression ifTrue表示结果为 true 时执行的表达式树。

示例

?
1
2
3
4
5
6
7
8
9
int a = 10;
int b = 10;
 
if (a == b)
{
    Console.WriteLine("a == b 为 true,语句被执行");
}
 
Console.ReadKey();

使用表达式树实现如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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,表达式树被执行"));
 
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();

生成的表达式树如下

?
1
2
3
4
5
6
7
8
9
.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,表达式树被执行")
    } .Else {
        .Default(System.Void)
    }
}

if...else

if...else 使用以下表达式树表示

?
1
ConditionalExpression IfThenElse(Expression test, Expression ifTrue, Expression ifFalse);

示例代码如下

?
1
2
3
4
5
6
7
8
9
10
11
12
int a = 10;
int b = 11;
 
if (a == b)
{
    Console.WriteLine("a == b 为 true,此语句被执行");
}
else
{
    Console.WriteLine("a == b 为 false,此语句被执行");
}
Console.ReadKey();

用表达式树实现如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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,此表达式树被执行"));
 
MethodCallExpression call2 = Expression.Call(
    null,
    typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }),
    Expression.Constant("a == b 为 false,此表达式树被执行"));
 
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();

生成的表达式树如下

?
1
2
3
4
5
6
7
8
9
.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,此表达式树被执行")
    } .Else {
        .Call System.Console.WriteLine("a == b 为 false,此表达式树被执行")
    }
}

switch

示例代码如下

?
1
2
3
4
5
6
7
8
9
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();

每个 case 使用 SwitchCase 类型表示,使用 Expression.SwitchCase 生成 SwitchCase 类型。

Expression.Switch 用来构建一个 switch 表达式树,

Expression.Switch 的重载比较多,常用的是这种形式

?
1
SwitchExpression Switch(Expression switchValue, Expression defaultBody, params SwitchCase[] cases);

switchValue 表示传入参数;

defaultBody 表示 default 执行的表达式;

cases 表示多条 case 。

上面代码对应使用表达式树编写如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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();

生成的表达式树如下

?
1
2
3
4
5
6
7
8
9
10
.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")
    }
}

很奇怪,没有 break,但是表达式树是正常的,并且运行没问题;

?? 和 ?:

?? 表示空合并运算符,例如 a ?? b,如果 a 不为 null,即返回 a,否则返回 b;

常用定义如下

?
1
BinaryExpression Coalesce(Expression left, Expression right)

这里就不再赘述。

?: 是三元运算符,例如 a > b ? a : b 。

常用定义如下

?
1
ConditionalExpression Condition(Expression test, Expression ifTrue, Expression ifFalse)

可以参考上面的 if...else 表达式树,这里不再赘述。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/whuanle/p/11552311.html

延伸 · 阅读

精彩推荐
  • C#C# 根据字符串生成二维码的实例代码

    C# 根据字符串生成二维码的实例代码

    这篇文章主要介绍了C# 根据字符串生成二维码的实例,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    江北3942022-09-24
  • C#C# NullReferenceException解决案例讲解

    C# NullReferenceException解决案例讲解

    这篇文章主要介绍了C# NullReferenceException解决案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    keneyr9182022-11-30
  • C#解答“60k”大佬的19道C#面试题(上)

    解答“60k”大佬的19道C#面试题(上)

    这篇文章主要解答了“60k”大佬的19道C#面试题中的10道,文中的面试题比较小众,作者给了不错的答案,相信对你以后的面试有所帮助,感兴趣就来了解下...

    .NET骚操作12092022-09-09
  • C#Visual Studio2022中没有mysql.dll的解决办法

    Visual Studio2022中没有mysql.dll的解决办法

    这篇文章介绍了Visual Studio2022中没有mysql.dll的解决办法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    每日出拳老爷子9822022-12-12
  • C#C#反射的入门之C#反射实例

    C#反射的入门之C#反射实例

    C#反射的入门学习首先要明白C#反射提供了封装程序集、模块和类型的对象等等。那么这样可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从...

    CSharp编程大全10352021-03-16
  • C#c# 利用易福门振动模块VSE002采集振动数据的方法

    c# 利用易福门振动模块VSE002采集振动数据的方法

    这篇文章主要介绍了c# 利用易福门振动模块VSE002采集振动数据的方法,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参...

    eveno9282022-08-31
  • C#基于StreamRead和StreamWriter的使用(实例讲解)

    基于StreamRead和StreamWriter的使用(实例讲解)

    下面小编就为大家分享一篇基于StreamRead和StreamWriter的使用实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    happy多乐9562022-02-12
  • C#C#中如何将MongoDB->RunCommand结果映射到业务类的方法总结

    C#中如何将MongoDB->RunCommand结果映射到业务类的方法总结

    这篇文章主要给大家总结介绍了关于C#中如何将MongoDB->RunCommand结果映射到业务类的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一...

    波斯码5202022-02-23