MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

C#中的条件语句与逻辑控制

2024-07-182.7k 阅读

C# 中的条件语句基础

在 C# 编程中,条件语句是控制程序流程的关键部分。它们允许程序根据特定条件决定执行哪些代码块。最基本的条件语句是 if 语句。

if 语句

if 语句用于根据一个布尔表达式的值来决定是否执行一段代码。其基本语法如下:

if (布尔表达式)
{
    // 如果布尔表达式为 true,则执行这里的代码
}

例如,我们要判断一个整数是否大于 10:

int number = 15;
if (number > 10)
{
    Console.WriteLine("数字大于 10");
}

在上述代码中,number > 10 是布尔表达式。由于 number 的值为 15,表达式为 true,所以会执行 Console.WriteLine("数字大于 10"); 这行代码,输出“数字大于 10”。

if - else 语句

if - else 语句扩展了 if 语句的功能,当 if 中的布尔表达式为 false 时,会执行 else 块中的代码。语法如下:

if (布尔表达式)
{
    // 如果布尔表达式为 true,则执行这里的代码
}
else
{
    // 如果布尔表达式为 false,则执行这里的代码
}

比如,我们来判断一个数是偶数还是奇数:

int num = 7;
if (num % 2 == 0)
{
    Console.WriteLine(num + " 是偶数");
}
else
{
    Console.WriteLine(num + " 是奇数");
}

这里 num % 2 == 0 用于判断 num 是否为偶数。因为 7 % 2 的结果不为 0,所以布尔表达式为 false,会执行 else 块中的代码,输出“7 是奇数”。

if - else if - else 语句

当有多个条件需要依次判断时,可以使用 if - else if - else 结构。语法如下:

if (布尔表达式1)
{
    // 如果布尔表达式1为 true,则执行这里的代码
}
else if (布尔表达式2)
{
    // 如果布尔表达式1为 false,且布尔表达式2为 true,则执行这里的代码
}
else
{
    // 如果所有布尔表达式都为 false,则执行这里的代码
}

假设我们要根据学生的成绩给出不同的评价:

int score = 85;
if (score >= 90)
{
    Console.WriteLine("优秀");
}
else if (score >= 80)
{
    Console.WriteLine("良好");
}
else if (score >= 60)
{
    Console.WriteLine("及格");
}
else
{
    Console.WriteLine("不及格");
}

在这个例子中,首先判断 score >= 90,由于 score 为 85,该表达式为 false。接着判断 score >= 80,此表达式为 true,所以会输出“良好”。

嵌套的条件语句

在 C# 中,条件语句可以嵌套使用,即在一个 ifelse 块中再包含另一个 if 语句。这在处理复杂逻辑时非常有用。

嵌套 if 语句示例

假设我们要判断一个点是否在特定的矩形区域内,矩形的左上角坐标为 (10, 10),宽度为 100,高度为 200。点的坐标为 (x, y)。

int x = 50;
int y = 150;
if (x >= 10)
{
    if (x <= 10 + 100)
    {
        if (y >= 10)
        {
            if (y <= 10 + 200)
            {
                Console.WriteLine("点在矩形区域内");
            }
        }
    }
}

这里通过多层嵌套的 if 语句,依次判断 xy 坐标是否满足矩形区域的条件。如果所有条件都满足,则输出“点在矩形区域内”。

嵌套 if - else 语句的逻辑复杂性

虽然嵌套的条件语句可以处理复杂逻辑,但随着嵌套层数的增加,代码的可读性会迅速下降。例如:

int value = 5;
if (value > 0)
{
    if (value < 10)
    {
        if (value % 2 == 0)
        {
            Console.WriteLine("值大于 0 小于 10 且为偶数");
        }
        else
        {
            Console.WriteLine("值大于 0 小于 10 且为奇数");
        }
    }
    else
    {
        Console.WriteLine("值大于等于 10");
    }
}
else
{
    Console.WriteLine("值小于等于 0");
}

在这种情况下,我们可以考虑使用其他方式来简化逻辑,比如逻辑运算符的组合使用,以提高代码的可读性和可维护性。

逻辑运算符与条件语句的结合

逻辑运算符在条件语句中起着关键作用,它们允许我们组合多个布尔表达式,从而构建更复杂的条件。C# 中有三种主要的逻辑运算符:&&(逻辑与)、||(逻辑或)和 !(逻辑非)。

逻辑与(&&)运算符

&& 运算符用于连接两个布尔表达式,只有当两个表达式都为 true 时,整个表达式才为 true。语法如下:

布尔表达式1 && 布尔表达式2

例如,我们要判断一个数是否在 10 到 20 之间(包括 10 和 20):

int num = 15;
if (num >= 10 && num <= 20)
{
    Console.WriteLine("数字在 10 到 20 之间");
}

这里 num >= 10num <= 20 两个表达式通过 && 连接。因为 num 为 15,两个表达式都为 true,所以整个表达式为 true,会执行 if 块中的代码。

逻辑或(||)运算符

|| 运算符连接两个布尔表达式,只要其中一个表达式为 true,整个表达式就为 true。语法如下:

布尔表达式1 || 布尔表达式2

比如,我们要判断一个人是否是成年人(年龄大于等于 18 岁)或者是儿童(年龄小于 13 岁):

int age = 10;
if (age >= 18 || age < 13)
{
    Console.WriteLine("是成年人或儿童");
}

由于 age 为 10,age < 13true,所以整个 if 语句中的布尔表达式为 true,会执行相应代码。

逻辑非(!)运算符

! 运算符用于对一个布尔表达式取反。如果表达式原本为 true,则 ! 运算后为 false;反之亦然。语法如下:

!布尔表达式

假设我们有一个布尔变量 isReady,表示是否准备好。我们要在未准备好时执行一些操作:

bool isReady = false;
if (!isReady)
{
    Console.WriteLine("尚未准备好,执行准备操作");
}

这里因为 isReadyfalse!isReady 就为 true,所以会执行 if 块中的代码。

switch - case 语句

switch - case 语句是另一种条件控制结构,它根据一个表达式的值来选择执行多个分支中的一个。与 if - else if - else 结构相比,switch - case 在处理多个离散值的情况时更加简洁和易读。

switch - case 基本语法

switch (表达式)
{
    case 值1:
        // 当表达式的值等于值1时执行这里的代码
        break;
    case 值2:
        // 当表达式的值等于值2时执行这里的代码
        break;
    default:
        // 当表达式的值不等于任何 case 的值时执行这里的代码
        break;
}

例如,根据一周中的某一天输出对应的英文名称:

int dayOfWeek = 3;
switch (dayOfWeek)
{
    case 1:
        Console.WriteLine("Monday");
        break;
    case 2:
        Console.WriteLine("Tuesday");
        break;
    case 3:
        Console.WriteLine("Wednesday");
        break;
    case 4:
        Console.WriteLine("Thursday");
        break;
    case 5:
        Console.WriteLine("Friday");
        break;
    case 6:
        Console.WriteLine("Saturday");
        break;
    case 7:
        Console.WriteLine("Sunday");
        break;
    default:
        Console.WriteLine("Invalid day");
        break;
}

在这个例子中,dayOfWeek 的值为 3,所以会执行 case 3 中的代码,输出“Wednesday”。

switch - case 中的 break 关键字

break 关键字在 switch - case 中非常重要。它用于结束当前 case 块的执行,并跳出 switch 语句。如果没有 break,当某个 case 匹配成功后,会继续执行后面所有 case 的代码,直到遇到 break 或者 switch 语句结束。例如:

int num = 2;
switch (num)
{
    case 1:
        Console.WriteLine("One");
    case 2:
        Console.WriteLine("Two");
    case 3:
        Console.WriteLine("Three");
        break;
    default:
        Console.WriteLine("Other");
        break;
}

这里 num 的值为 2,会执行 case 2 中的代码输出“Two”。由于没有 break,会继续执行 case 3 中的代码输出“Three”,然后遇到 break 跳出 switch 语句。

switch - case 的表达式类型

switch 语句中的表达式可以是多种类型,包括整数类型(如 intbyteshortlong 等)、字符类型(char)、枚举类型以及字符串类型(从 C# 7.0 开始支持)。例如,使用字符串类型的 switch - case

string color = "red";
switch (color)
{
    case "red":
        Console.WriteLine("红色");
        break;
    case "blue":
        Console.WriteLine("蓝色");
        break;
    case "green":
        Console.WriteLine("绿色");
        break;
    default:
        Console.WriteLine("其他颜色");
        break;
}

这里根据 color 字符串的值来执行相应的 case 块。

条件运算符(三元运算符)

条件运算符,也称为三元运算符,是一种简洁的条件判断方式,它可以在一行代码中实现简单的 if - else 逻辑。

条件运算符语法

布尔表达式? 表达式1 : 表达式2

如果 布尔表达式true,则返回 表达式1 的值;否则返回 表达式2 的值。

例如,我们要获取两个数中的较大值:

int a = 10;
int b = 15;
int max = a > b? a : b;
Console.WriteLine("较大值为: " + max);

这里 a > b 是布尔表达式。由于 b 大于 a,表达式为 false,所以返回 b 的值,max 最终为 15。

条件运算符的嵌套使用

条件运算符也可以嵌套使用,以处理更复杂的逻辑。但需要注意,嵌套过多会降低代码的可读性。例如,判断三个数中的最大值:

int x = 5;
int y = 10;
int z = 7;
int maxValue = x > y? (x > z? x : z) : (y > z? y : z);
Console.WriteLine("最大值为: " + maxValue);

这里先判断 x 是否大于 y,如果是,再判断 x 是否大于 z,以确定最大值;如果 x 不大于 y,则判断 y 是否大于 z 来确定最大值。

条件语句在实际编程中的应用场景

输入验证

在接收用户输入时,经常需要使用条件语句来验证输入是否符合要求。例如,在一个要求输入年龄的程序中,我们可以验证输入是否为正整数且在合理范围内:

Console.Write("请输入你的年龄: ");
string input = Console.ReadLine();
int age;
if (int.TryParse(input, out age) && age > 0 && age < 120)
{
    Console.WriteLine("你的年龄是: " + age);
}
else
{
    Console.WriteLine("输入的年龄无效");
}

这里 int.TryParse 用于尝试将输入字符串转换为整数,并通过 && 运算符结合其他条件来验证输入的有效性。

业务逻辑处理

在企业级应用开发中,条件语句用于实现各种业务逻辑。比如,在一个电商系统中,根据不同的用户等级和购买金额计算折扣:

string userLevel = "Silver";
double purchaseAmount = 200;
double discount;
if (userLevel == "Gold")
{
    if (purchaseAmount >= 100)
    {
        discount = 0.15;
    }
    else
    {
        discount = 0.1;
    }
}
else if (userLevel == "Silver")
{
    if (purchaseAmount >= 100)
    {
        discount = 0.1;
    }
    else
    {
        discount = 0.05;
    }
}
else
{
    discount = 0;
}
Console.WriteLine("折扣为: " + discount * 100 + "%");

此代码根据用户等级和购买金额计算相应的折扣,体现了条件语句在业务逻辑处理中的应用。

游戏开发中的条件判断

在游戏开发中,条件语句用于控制游戏流程和角色行为。例如,在一个简单的角色扮演游戏中,根据角色的生命值判断角色是否死亡:

int health = 0;
if (health <= 0)
{
    Console.WriteLine("角色死亡");
    // 执行角色死亡相关的逻辑,如显示死亡动画等
}
else
{
    Console.WriteLine("角色存活");
    // 执行角色存活时的逻辑,如可进行移动、攻击等操作
}

通过这样的条件判断,游戏可以根据角色的状态执行不同的逻辑。

条件语句的优化与最佳实践

减少嵌套深度

如前文所述,嵌套的条件语句过多会降低代码的可读性和可维护性。我们可以通过提前返回、合并条件等方式来减少嵌套深度。例如,将之前判断点是否在矩形区域内的代码优化:

int x = 50;
int y = 150;
if (x < 10 || x > 10 + 100 || y < 10 || y > 10 + 200)
{
    Console.WriteLine("点不在矩形区域内");
}
else
{
    Console.WriteLine("点在矩形区域内");
}

这里通过逻辑或运算符将条件合并,避免了多层嵌套。

使用多态替代复杂条件语句

在面向对象编程中,当遇到根据不同类型执行不同逻辑的复杂条件语句时,可以考虑使用多态来优化。例如,假设有不同类型的图形(圆形、矩形、三角形),需要计算它们的面积。传统的条件语句实现如下:

string shapeType = "Circle";
double radius = 5;
double length = 10;
double width = 5;
double area;
if (shapeType == "Circle")
{
    area = Math.PI * radius * radius;
}
else if (shapeType == "Rectangle")
{
    area = length * width;
}
else if (shapeType == "Triangle")
{
    // 假设为直角三角形,这里简单计算面积
    area = 0.5 * length * width;
}
else
{
    area = 0;
}
Console.WriteLine("面积为: " + area);

通过多态优化后:

abstract class Shape
{
    public abstract double CalculateArea();
}

class Circle : Shape
{
    public double Radius { get; set; }
    public override double CalculateArea()
    {
        return Math.PI * Radius * Radius;
    }
}

class Rectangle : Shape
{
    public double Length { get; set; }
    public double Width { get; set; }
    public override double CalculateArea()
    {
        return Length * Width;
    }
}

class Triangle : Shape
{
    public double Base { get; set; }
    public double Height { get; set; }
    public override double CalculateArea()
    {
        return 0.5 * Base * Height;
    }
}

class Program
{
    static void Main()
    {
        Shape shape;
        string shapeType = "Circle";
        if (shapeType == "Circle")
        {
            shape = new Circle { Radius = 5 };
        }
        else if (shapeType == "Rectangle")
        {
            shape = new Rectangle { Length = 10, Width = 5 };
        }
        else if (shapeType == "Triangle")
        {
            shape = new Triangle { Base = 10, Height = 5 };
        }
        else
        {
            shape = null;
        }
        if (shape != null)
        {
            double area = shape.CalculateArea();
            Console.WriteLine("面积为: " + area);
        }
    }
}

虽然初始化部分仍有条件语句,但计算面积的逻辑通过多态实现,代码更加清晰和可扩展。

代码的可读性和注释

在编写条件语句时,保持代码的可读性至关重要。合理使用缩进、空格和换行,使代码结构清晰。同时,对于复杂的条件逻辑,添加注释说明代码的意图。例如:

// 判断用户是否为管理员且访问权限为高级
if (user.IsAdmin && user.AccessLevel == AccessLevel.High)
{
    // 执行允许高级操作的代码
    Console.WriteLine("允许执行高级操作");
}
else
{
    // 执行拒绝操作的代码
    Console.WriteLine("拒绝执行高级操作");
}

通过这样的注释,即使代码的阅读者不熟悉业务逻辑,也能快速理解代码的作用。

条件语句与其他编程概念的关联

与循环语句的结合

条件语句经常与循环语句一起使用,以实现更复杂的控制逻辑。例如,在 while 循环中使用条件语句来控制循环的结束条件。假设我们要从 1 加到 100,当和超过 500 时停止:

int sum = 0;
int i = 1;
while (true)
{
    sum += i;
    if (sum > 500)
    {
        break;
    }
    i++;
}
Console.WriteLine("和为: " + sum);

这里通过 if 语句在 while 循环中判断和是否超过 500,当超过时使用 break 跳出循环。

条件语句与函数的关系

函数中经常使用条件语句来根据不同的输入执行不同的逻辑。例如,一个根据输入的运算符执行相应数学运算的函数:

double Calculate(double num1, double num2, char operation)
{
    switch (operation)
    {
        case '+':
            return num1 + num2;
        case '-':
            return num1 - num2;
        case '*':
            return num1 * num2;
        case '/':
            if (num2 != 0)
            {
                return num1 / num2;
            }
            else
            {
                Console.WriteLine("除数不能为 0");
                return double.NaN;
            }
        default:
            Console.WriteLine("无效的运算符");
            return double.NaN;
    }
}

在这个函数中,通过 switch - case 语句根据不同的运算符执行相应的运算,并通过 if - else 语句处理除法运算中除数为 0 的情况。

条件语句与面向对象编程

在面向对象编程中,条件语句用于实现对象的行为控制。例如,一个根据对象状态执行不同操作的方法:

class Door
{
    public bool IsOpen { get; set; }

    public void PerformAction()
    {
        if (IsOpen)
        {
            Console.WriteLine("关闭门");
            IsOpen = false;
        }
        else
        {
            Console.WriteLine("打开门");
            IsOpen = true;
        }
    }
}

Door 类的 PerformAction 方法中,通过 if - else 语句根据 IsOpen 的状态执行打开或关闭门的操作,并更新对象的状态。

通过以上对 C# 中条件语句与逻辑控制的详细介绍,我们深入了解了各种条件语句的语法、用法、应用场景以及与其他编程概念的关联。在实际编程中,合理运用条件语句可以使程序更加灵活、高效地运行,满足各种复杂的业务需求。同时,遵循最佳实践和优化原则,能够提高代码的质量和可维护性。无论是小型的控制台应用还是大型的企业级项目,条件语句都是不可或缺的编程工具。