5.判断语句
[TOC]

判断语句

C# 提供了以下类型的判断语句:
语句
描述
if
一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。
if...else
一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。
嵌套 if 语句
您可以在一个 ifelse if 语句内使用另一个 ifelse if 语句。
switch 语句
一个 switch 语句允许测试一个变量等于多个值时的情况。
嵌套 switch 语
您可以在一个 switch 语句内使用另一个 switch 语句。
当然还有 ???: 等判断,下面将详细实践。

if

If 语句,使用 IfThen(Expression test, Expression ifTrue); 来表达
Expression test表示用于判断的表达式,Expression ifTrue表示结果为 true 时执行的表达式树。
示例
1
int a = 10;
2
int b = 10;
3
4
if (a == b)
5
{
6
Console.WriteLine("a == b 为 true,语句被执行");
7
}
8
9
Console.ReadKey();
Copied!
使用表达式树实现如下
1
ParameterExpression a = Expression.Variable(typeof(int), "a");
2
ParameterExpression b = Expression.Variable(typeof(int), "b");
3
MethodCallExpression call = Expression.Call(
4
null,
5
typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }),
6
Expression.Constant("a == b 为 true,表达式树被执行"));
7
8
ConditionalExpression _if = Expression.IfThen(Expression.Equal(a, b),call);
9
10
Expression<Action<int, int>> lambda = Expression.Lambda<Action<int, int>>(_if,a,b);
11
lambda.Compile()(10,10);
12
13
Console.ReadKey();
Copied!
生成的表达式树如下
1
.Lambda #Lambda1<System.Action`2[System.Int32,System.Int32]>(
2
System.Int32 $a,
3
System.Int32 $b) {
4
.If ($a == $b) {
5
.Call System.Console.WriteLine("a == b 为 true,表达式树被执行")
6
} .Else {
7
.Default(System.Void)
8
}
9
}
Copied!

if...else

if...else 使用以下表达式树表示
1
ConditionalExpression IfThenElse(Expression test, Expression ifTrue, Expression ifFalse);
Copied!
示例代码如下
1
int a = 10;
2
int b = 11;
3
4
if (a == b)
5
{
6
Console.WriteLine("a == b 为 true,此语句被执行");
7
}
8
else
9
{
10
Console.WriteLine("a == b 为 false,此语句被执行");
11
}
12
Console.ReadKey();
Copied!
用表达式树实现如下
1
ParameterExpression a = Expression.Variable(typeof(int), "a");
2
ParameterExpression b = Expression.Variable(typeof(int), "b");
3
MethodCallExpression call1 = Expression.Call(
4
null,
5
typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }),
6
Expression.Constant("a == b 为 true,此表达式树被执行"));
7
8
MethodCallExpression call2 = Expression.Call(
9
null,
10
typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }),
11
Expression.Constant("a == b 为 false,此表达式树被执行"));
12
13
ConditionalExpression _if = Expression.IfThenElse(Expression.Equal(a, b), call1,call2);
14
15
Expression<Action<int, int>> lambda = Expression.Lambda<Action<int, int>>(_if, a, b);
16
lambda.Compile()(10, 11);
17
18
Console.ReadKey();
Copied!
生成的表达式树如下
1
.Lambda #Lambda1<System.Action`2[System.Int32,System.Int32]>(
2
System.Int32 $a,
3
System.Int32 $b) {
4
.If ($a == $b) {
5
.Call System.Console.WriteLine("a == b 为 true,此表达式树被执行")
6
} .Else {
7
.Call System.Console.WriteLine("a == b 为 false,此表达式树被执行")
8
}
9
}
Copied!

switch

示例代码如下
1
int a = 2;
2
switch (a)
3
{
4
case 1:Console.WriteLine("a == 1");break;
5
case 2:Console.WriteLine("a == 2");break;
6
default:Console.WriteLine("a != 1 && a = 2");
7
}
8
9
Console.ReadKey();
Copied!
每个 case 使用 SwitchCase 类型表示,使用 Expression.SwitchCase 生成 SwitchCase 类型。
Expression.Switch 用来构建一个 switch 表达式树,
Expression.Switch 的重载比较多,常用的是这种形式
1
SwitchExpression Switch(Expression switchValue, Expression defaultBody, params SwitchCase[] cases);
Copied!
switchValue 表示传入参数;
defaultBody 表示 default 执行的表达式;
cases 表示多条 case 。
上面代码对应使用表达式树编写如下
1
ParameterExpression a = Expression.Parameter(typeof(int), "a");
2
MethodCallExpression _default = Expression.Call(
3
null,
4
typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }),
5
Expression.Constant("a != 1 && a = 2"));
6
7
SwitchCase case1 = Expression.SwitchCase(
8
Expression.Call(null,
9
typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }),
10
Expression.Constant("a == 1")),
11
new ConstantExpression[] { Expression.Constant(1) }
12
);
13
14
SwitchCase case2 = Expression.SwitchCase(
15
Expression.Call(null,
16
typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }),
17
Expression.Constant("a == 2")),
18
new ConstantExpression[] { Expression.Constant(2) }
19
);
20
21
SwitchExpression _switch = Expression.Switch(a, _default, new SwitchCase[] { case1, case2 });
22
Expression<Action<int>> lambda = Expression.Lambda<Action<int>>(_switch, a);
23
lambda.Compile()(1);
24
25
Console.ReadKey();
Copied!
生成的表达式树如下
1
.Lambda #Lambda1<System.Action`1[System.Int32]>(System.Int32 $a) {
2
.Switch ($a) {
3
.Case (1):
4
.Call System.Console.WriteLine("a == 1")
5
.Case (2):
6
.Call System.Console.WriteLine("a == 2")
7
.Default:
8
.Call System.Console.WriteLine("a != 1 && a = 2")
9
}
10
}
Copied!
很奇怪,没有 break,但是表达式树是正常的,并且运行没问题;

?? 和 ?:

?? 表示空合并运算符,例如 a ?? b,如果 a 不为 null,即返回 a,否则返回 b;
常用定义如下
1
BinaryExpression Coalesce(Expression left, Expression right)
Copied!
这里就不再赘述。
?: 是三元运算符,例如 a > b ? a : b 。
常用定义如下
1
ConditionalExpression Condition(Expression test, Expression ifTrue, Expression ifFalse)
Copied!
可以参考上面的 if...else 表达式树,这里不再赘述。