C#选择结构

选择结构用于进行判断。

if 选择结构

语法 :

if(表达式)
{
    语句
}

表达式需要返回bool,如果为true,则执行语句。

当只有一条语句时,可以省略花括号,但建议始终保持花括号。

检查一个数是不是偶数

int i = Int32.Parse(Console.ReadLine());
if(i % 2==0)
{
    Console.WriteLine(i+"是偶数");
}

if else 选择结构

语法 :

if(表达式)
{
    语句1
}
else
{
    语句2
}

表达式为true,则执行语句1,否则执行语句2

检查一个数是偶数还是奇数

int i = Int32.Parse(Console.ReadLine());
if(i % 2 == 0){
    Console.WriteLine(i+"是偶数");
}else{
    Console.WriteLine(i+"是奇数");
}

if else if 语句

else中,可以继续使用if,进一步进行判断

语法 :

if(表达式1){
    语句1
}else if(表达式2){
    语句2
}else if(表达式3){
    语句3
}else{
    语句4
}
int i = Int32.Parse(Console.ReadLine());
if(i<0){
    Console.WriteLine(i+"是负数");
}else if(i < 10){
    Console.WriteLine(i+"是个1位数");
}else if(i<100){
    Console.WriteLine(i+"是个2位数");
}else{
    Console.WriteLine(i+"大于2位的数");
}

使用if else if时,如果前面的if有被匹配的,不会再进行下面的判断;判断到下面了,说明上面的条件都不符合。

if 的嵌套

if else的每个语句块中,可以继续使用if else

int i = Int32.Parse(Console.ReadLine());
if(i % 2==0)
{
    Console.WriteLine(i+"是偶数");
    if(i % 5 ==0)
    {
        Console.WriteLine(i+"是5的倍数");
    }
}

一般if不嵌套过深,超过3层建议重构代码到另一个方法。

switch 分支结构

语法

switch(表达式)
{
    case 常量1:
        语句块1
        break;
    case 常量2:
        语句块2
        break;
        ...
    case 常量n:
        语句块n
        break;
    default:
        默认语句块
        break;
}

switch对表达式进行计算,将结果依次和case中的常量进行对比,如果符合,执行对于语句块,不再进行后续判断。如果所有的case都不符合,执行default中的语句块。 如果语句块中的代码包含跳转语句,比如return,throw则对应case不需要break

switch和if对比

switch只支持和常量的相等对比,相当于每一个if分支都是等于。 switch效率更高。

更好的代码

大量的switch分支和if分支会使程序过长,难以维护。

对于大量的switch分支,建议使用字典来对每个分支的值和处理程序进行存储。

对于大量if分支,使用责任链、状态模式这样的设计模式对逻辑进行分散。

模式匹配(C#7.0)

if和switch语句支持类型的模式匹配。

if(obj is null)
{

}
else if(obj is 类型1 变量名1)
{

}
else if(obj is 类型2 变量名2)
{

}
else
{

}
switch(obj){
   case null:
        break
    case 类型1 变量名1:
        break;
    case 类型2 变量名2:
        break;
    default:
        break;
}