选择就是程序分支。即利用某个条件,选择程序进行的方向。

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”。


兔子码农
2 声望1 粉丝

一个酒晕子