选择就是程序分支。即利用某个条件,选择程序进行的方向。
if
if 是分支里面最复杂的、最常用的。它会测试其后的括号内的表达式(通常返回值是 bool),并转换为 bool,已确定括号内为 true 它要做点什么。它可以包括另外的关键字 else,即当括号内为 false 它又要做点什么。
最简单的 if
Console . WriteLine ( "请输入一个字符串(不输入或者全是空格将显示警告):" );
string? zfc输入 = Console . ReadLine ( );
if ( string . IsNullOrEmpty ( zfc输入 ) | string . IsNullOrWhiteSpace ( zfc输入 ) ) // 若输入为 null 或 全是空格,这段忽略
{
Console . WriteLine ( "你输了些啥啊?" );
}
上例中的 string? zfc输入 = Console . ReadLine ( );
中的 string? 表示 zfc输入 这个变量可以是 null,你啥也没输。那么这个简单的 if 就意思明了了,当你的输入有全是空格之外的其他内容,例如“123”、“abc”、“ abc”啥的,if 后面括号内的测试是不成立的(false,zfc输入 既不是 null、empty,也不是全都是空格),代码啥事也不干;否则,例如你直接回车(IsNullOrEmpty 为 true),输入几个空格后回车(IsNullOrWhiteSpace 为 true)等(中间的 | 运算符为逻辑或运算),if 后的括号内的测试是成立的(true),代码会返回:
你输了些啥啊?
稍复杂点的 if
Console . WriteLine ( "请输入一个字符串(不输入或者全是空格将显示警告):" );
string? zfc输入 = Console . ReadLine ( );
if ( string . IsNullOrEmpty ( zfc输入 ) | string . IsNullOrWhiteSpace ( zfc输入 ) ) // 根据你输入的字符串确定要做什么
{
Console . WriteLine ( $"你输了些啥啊?" ); // 你啥也没输入或者全是空格
}
else
{
Console . WriteLine ( $"你输了些:{zfc输入}" ); // 你输入了除了全是空格之外的内容
}
与简单的 if 类似,唯一的区别是当你输入某些非全是空格的内容(abc 啥的),代码将返回:
你输入了些:abc
所以,不包含 else 的 if 仅限于括号内的条件成立(true)的时候,这个分支会产生效用,否则无效(啥效果没有)。else 则是代码的另一个分支。
多个 if 与 else
单分支与双分支并无法表达某些事物的全部方面。
下面我们创建一个方法,用于接受一个数值(0 ~ 100 之间),表示某学生考试成绩并以其存在的范围给出其优良程度(满分(≥ 100)、优良(≥ 80 且 ≠ 100)、及格(≥ 60 且 < 80)、不及格(> 0 且 < 60)、零分(= 0)):
private static string FF优良程度 ( double 分数 )
{
if ( 分数 >= 100 )
{
return "满分";
}
else if ( 分数 >= 80 )
{
return "优良";
}
else if ( 分数 >= 60 )
{
return "及格";
}
else if ( 分数 > 0 )
{
return "不及格";
}
else if ( 分数 == 0 )
{
return "零分";
}
else
{
return "输入负分将退出。";
}
}
本例中,使用了该方法的 分数 参数作为 if 分支的条件,并且从高到低分别描述你输入的成绩(任意 double)产生的输出,你的成绩的优良程度。必须从高到低或从低到高排列,否则会产生混乱。
例如若把 else if ( 分数 >= 80 )
代码段与 else if ( 分数 >= 60 )
代码段位置交换,由于 return 直接退出方法,当成绩为 85 的时候返回值是“及格”而不是“优良”,因为 85 确实大于等于 60。
你可以把 if 后面的条件改的更复杂,每个条件都类似下者:else if ( 分数 >= 60 & 分数 < 80 )
这时候你可以把每个分支代码段互换位置,但不推荐这样做,实在太乱了……
switch
switch 会根据表达式的与匹配模式的匹配程度选择某个分支。可以包括另外的关键字 default 和 when。
下面的方法会返回你指定的 double 的符号或者 ±∞、NaN:
private static string FFdouble类型 ( double 值 )
{
switch ( 值 )
{
case double . NaN:
return "double . NaN";
case double . NegativeInfinity:
return "double . NegativeInfinity(﹣∞)";
case double . PositiveInfinity:
return "double . PositiveInfinity(﹢∞)";
case < 0:
return "负值";
case > 0:
return "正值";
default:
return "零";
}
}
上述方法将对传进来的 值 变量分析,以确定它是一个什么 double。必须先检测 NaN 和 ±∞,因为 ±∞ 分别被算成正负数(当然,它们真的分别是一个值)。
上例还描述了 default case。即所有的其他 case 均不匹配(上例即为 0)就会返回“零”。default 可以出现在 switch 块中的任何位置,通常放在最后面(重要的事情最后说)。
每一个 case 都是一个标签,在 switch 内部,可以使用 goto 语句切换到 default 或其他 case。
上例中,仅分析了 值 变量的值,每个值都描述了一个 case(包括 default),即与该 case 的布尔运算为 true。
不返回值的 switch
上例中,每个 case 块都是用 return 返回值,直接退出方法了。若不返回值,那就需要在每个 case 块后面添加一个 break 语句,防止 case 贯穿到下一个 case。例如:
下面描述一个打工仔的生活状态(伪代码),根据他在什么地方确定他在干啥:
private static void FF干啥 ( position 位置 )
{
switch ( 位置 )
{
case 家:
case 厂房:
{
// 辛苦工作的代码
break;
}
default:
{
// 到处溜达的代码
break;
}
}
}
上例中,通过描述 位置 的变量来描述一个打工仔在干啥。在家啥事也不干;在厂房里辛苦工作或者在大街上溜达。
实际上,可以用下述四种方式退出或转移控制权给其他 case 块:
- break:仅仅是退出当前 switch,并不返回值,如上例
- return:包括当前 switch 的方法或函数被中断,或许可以根据其参数返回值,如第一个 switch 例程
- throw:产生异常。并把控制权传递给包含 switch 的 try
- goto:每个 case 都是标签(末尾以“:”结尾),因此 goto 可以把控制权传递给任意 case
另外的 case
case 通常的表达式或许不够满足你的要求。例如当你需要对两个数(必须大于零),且当两个数相同或不同时不一样的处理方式时,可以添加 when 关键字:
private static void FF处理两个数 ( int z1 , int z2 )
{
switch (z1, z2)
{
case ( > 0 , > 0 ) when z1 == z2:
Console.WriteLine( z1 * z2 );
break;
case ( > 0, > 0 ):
Console . WriteLine ( z1 + z2 );
break;
default:
Console . WriteLine ( "两个数中某一个 ≤ 0" );
break;
}
}
上面这个方法实际处理两个 int。仅当两个 int 均大于零,且相等,返回两个 int 的乘积;仅当两个 int 均大于零,且不等,返回两个 int 的和;否则返回“两个数中某一个 ≤ 0”。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。