【C#基础】C# 常用语句讲解

news2024/9/22 4:07:37
序号系列文章
3【C#基础】C# 数据类型总结
4【C#基础】C# 变量和常量的使用
5【C#基础】C# 运算符总结

文章目录

  • 前言
  • 语句概念
  • 1,迭代语句
    • 1.1 for 语句
    • 1.2 foreach 语句
    • 1.3 while 语句
    • 1.4 do 语句
  • 2,选择语句
    • 2.1,if 语句
    • 2.2,else 语句
    • 2.3,switch 语句
  • 3,跳转语句
    • 3.1 break 语句
    • 3.2 continue 语句
    • 3.3 goto 语句
    • 3.4 return 语句
  • 结语

前言

😊大家好,我是writer桑,前面一章已经学习了 C# 中运算符的使用,那本章就开始学习 C# 程序中的常用语句吧,希望看完大家能够有所收获,感谢支持!


语句概念

程序的执行操作使用语句表示,常见的语句操作包括声明迭代、判断语句、调用方法,以及根据给定条件分支到一个或另一个代码块等。语句在程序中的执行顺序称为 “控制流” 或 “执行流”, 也即程序根据语句执行着不同的操作。

1,迭代语句

迭代语句表示反复执行的语句或语句块,直到满足某些条件为止,其中包括 for 语句、foreach 语句、do 语句和 while 语句 。使用迭代语句实现重复控制结构时,在迭代语句中的任何地方,都可以使用 break 语句跳出当前所在循环,或者使用 continue 语句进行循环的下一个迭代。

1.1 for 语句

for 语句内指定的条件判断为 true 时,for 语句会执行一次循环体的内容,直到条件判断为 false 时会结束循环。实现一个小于5的计数器例子,借此来讨论 for 语句的语法。

示例如下:

for (int i = 0; i < 5;i++)     // 初始化表达式;条件判断;迭代部分
{
    Console.WriteLine(i);       // 循环体的声明 
} 

上述示例展示了 for 语句的构成部分:

  • “初始化表达式” 部分仅在进入循环前执行一次。通常在该部分中声明并初始化局部循环变量,但不能从 for 语句外部访问声明的变量。

上例中的"初始化表达式"部分声明并初始化了 int 类型的变量 i :

int i = 0;
  • “条件判断” 部分是用来确定是否应执行循环中的下一个迭代。如果判断结果为 true 或为 null, 则执行下一个迭代;否则退出循环,同时条件判断部分必须为布尔表达式。

上例中的"条件判断"部分表示判断变量 i 是否小于 5:

i < 5;
  • “迭代部分” 是在循环体每次执行完后再执行的操作。

上例中的"迭代部分"使用增量运算符表示每次执行完 i 变量加1:

i++
  • "循环体"部分表示 for 语句每次循环需要执行的内容,同时"循环体"部分必须是一个语句或代码块。

上例中的"循环体"部分在每次循环中输出变量 i:

Console.WriteLine(i);

for 语句流程图:
在这里插入图片描述

注意,for 语句的所有部分都是可选的, 可以在 for 语句的外部声明上述的三个部分,如果缺少部分声明可能会造成无限 for 循环。

示例如下:

// 报错,省略初始化部分 
for(; i < 5; i++)
{
    Console.WriteLine(i);
}
// 死循环,省略条件判断部分 
for (int j = 1; ; j++)
{
    Console.WriteLine(j);
}
// 死循环,省略迭代部分 
for (int k = 1; k < 5;)
{
    Console.WriteLine(k);
}
// 三个部分都省略
for (; ; )
{
    // 死循环...
}

1.2 foreach 语句

foreach 语句用于列举出迭代对象中所有的元素,foreach 语句中的表达式由关键字 in 隔开的两个项组成。in 右边的项是可迭代对象,in 左边的项是只读变量,用来存放该集合中的每个元素。 借一个简单的示例讨论 foreach 语句的语法。

示例如下:

// 可迭代对象 fibNumbers 
var fibNumbers = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13 };

foreach (int element in fibNumbers)     // 只读变量 element 
{
    Console.Write($"{element} ");		// 循环体 
} 

// 输出: 
// 0 1 1 2 3 5 8 13 

上述示例展示了 foreach 语句的构成部分:

  • “可迭代对象” 也即可以被 foreach 语句迭代的对象,当一个对象实现了 GetEnumerator 方法且具有公共 Current 属性和公共无参数 MoveNext 方法时,这个对象就可以被 foreach 语句迭代。

上例中的"可迭代对象"声明了一个 List 类型的元素 fibNumbers,并存放了一些数字元素:

var fibNumbers = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13 };
  • "只读变量"在循环中接收迭代对象中的元素,可迭代对象中的每个元素都会依次赋值给只读变量。可以在循环体中对只读变量进行操作。

上例中的"迭代元素"声明了一个 int 类型的元素 element :

int element in fibNumbers
  • "循环体"部分表示 foreach 语句每次循环需要执行的内容,同时"循环体"部分必须是一个语句或代码块。

上例中的"循环体"部分在每次循环中输出变量 element:

Console.Write($"{element} ");		// 循环体 

foreach 语句流程图:
在这里插入图片描述


1.3 while 语句

while 语句表示当指定的布尔表达式的计算结果为 true 时,while 语句就会执行一条语句或一个语句块。 由于在每次执行循环之前都会计算布尔表达式, 所以 while 循环会执行零次或多次。借一个简单的例子讨论 while 语句的语法。

示例如下:

int n = 0;

while (n < 5)
{
    Console.WriteLine(n);   // 循环体 
    n++;
}

// 输出: 
// 01234

上述示例展示了 while 语句的构成部分:

  • "布尔表达式"部分表示 while 语句每次循环执行之前需要计算的结果,若结果为 true 则执行循环体,反之则退出循环。

上例中的"布尔表达式"声明了 int 类型 n 并判断是否小于5:

while (n < 5)
  • "循环体"部分表示 while 语句每次循环需要执行的大括号里的内容,同时"循环体"部分必须是一个语句或代码块。

上例中的"循环体"部分在每次循环中输出整数变量 n,并令 n 自增:

Console.WriteLine(n);   // 循环体 
n++;

while 语句流程图:
在这里插入图片描述


1.4 do 语句

do 语句会先执行一次循环体中的语句;再判断while语句中布尔表达式是否为真, 如果条件判断为真则继续循环,反之则终止循环。 由于在每次执行循环之后都会计算布尔表达式,所以 do 循环会执行一次或多次,注意不同于 while 循环是执行零次或多次。 借一个简单的例子讨论 do 语句的语法。

示 例:

int n = 0;		// 声明整数 n

do
{
    Console.Write(n);	// 循环体 
    n++;
} while (n < 5);		// while 条件判断式 

// 输出: 
// 01234 

上述示例展示了 do 语句的构成部分:

  • "循环体"部分跟 while 语句一样, 表示每次判断为 true 时需要执行的行为,同时"循环体"部分必须是一个语句或代码块。

上例中的"循环体"部分在每次循环中输出整数变量 n,并令 n 自增:

Console.Write(n);	// 循环体 
n++;
  • do 语句的"布尔表达式"部分与 while 语句没有区别。表示 while 语句每次循环执行之前需要计算的结果,若结果为 true 则执行循环体,反之则结束循环。

上例中的"布尔表达式"声明了 int 类型 n 并判断是否小于5:

while (n < 5);

do 语句流程图:
在这里插入图片描述

2,选择语句

选择语句是根据表达式的值从许多可能的路径中选择要执行的语句,其中包括 if 、else 和 switch 语句。 if 语句可与 else 结合使用,基于布尔表达式选择不同的路径。语句 switch 根据与表达式的模式匹配要执行的语句列表。

2.1,if 语句

if 语句由一个布尔表达式和一个或多个语句组成。 if 语句仅在布尔表达式计算结果为 true 时执行指定的语句部分,计算结果为 false 时则语句结束。借一个示例来讨论 if 语句的语法。

示例如下:

int value = 100; 

if (value < 0 || value > 100)
{
    Console.Write($"{value}小于0或者大于100");
}

if 语句的构成部分:

  • "布尔表达式"计算结果为 true 则执行指定的语句,计算结果为 false 则什么都不执行。

上例中的布尔表达式声明 int 类型变量 value 是否小于0或大于 100:

(value < 0 || value > 100)
  • if 语句的执行部分由一个或多个语句构成,仅在布尔表达式计算结果为 true 时执行。

上例中的语句执行部分将输出 value 变量:

Console.Write($"{value}小于0或者大于100");

if 语句的流程图:
在这里插入图片描述

2.2,else 语句

else 语句与 if 语句搭配,else 语句在 if 语句的布尔表达式计算结果为 false 时执行。 借一个示例来讨论 else 语句的语法。

示例如下:

int number = 20;

if (number < 20)        // 结果为 true 时执行 
{
    Console.WriteLine("number小于20");
}
else                   // 结果为 false 时执行  
{
    Console.WriteLine("number大于等于20");
} 

else 语句的构成部分:

  • 当 if 语句的布尔表达式为 false 时执行 else 中的一个或多个语句的执行部分。

上例中的 else 语句的执行部分输出 number 变量大于等于20的提示信息:

Console.WriteLine("number大于等于20");

if…else 语句的流程图:
在这里插入图片描述

2.3,switch 语句

switch 语句根据给定的表达式参数与 case 关键字声明的匹配表达式匹配时,对应的匹配模式会执行指定的一个或多个语句部分。以一个示例来说明 switch 语句的语法。

示例如下:

double measurement = 1.1;		// 声明测量值

switch (measurement)	// switch(表达式参数)
{
    // case 匹配表达式 
    case < 0.0:
        Console.WriteLine($"测量值为{measurement},太低了");
        break;
    case > 15.0:
        Console.WriteLine($"测量值为{measurement},太高了");
        break;
    case double.NaN:
        Console.WriteLine("失败的测量值。");
        break;
    default:		// 默认部分
        Console.WriteLine($"测量值为{measurement}.");
        break; 
}

switch 语句的构成部分:

  • 参数表达式部分必须是一个整型或枚举类型,又或者是可以转换为整型或枚举类型的 class 类型。 参数用于与 switch 语句内的 case 语句匹配。

上例的参数表达式部分声明了一个 double 类型的变量 measurement:

double measurement = 1.1;		// 声明测量值

switch (measurement)	// switch(表达式参数)
  • 匹配表达式部分表示一个匹配的条件,使用 case 关键字声明。switch 语句可以有多个 case 语句,当匹配表达式布尔值为 true 时则执行对应的语句部分,若布尔值为 false 时则直接执行执行下一个匹配部分直到 switch 语句结束。

上例的匹配表达式部分声明了三个 case 语句:

// case 匹配表达式 
case < 0.0:
    //...
case > 15.0:
    //...
case double.NaN:
    //...
  • "执行语句"部分即匹配结果为 true 时执行的语句,注意 C# 不支持从一个 case 标签显式贯穿到另一个 case 标签, 所以在 case 执行语句不为空的情况下需要声明 break 或其它跳转语句。

上例中的执行语句部分输出了 measurement 变量的提示信息和 break 语句 :

case < 0.0:
   Console.WriteLine($"测量值为{measurement},太低了");
    break;
case > 15.0:
    Console.WriteLine($"测量值为{measurement},太高了");
    break;
case double.NaN:
    Console.WriteLine("失败的测量值。");
    break;
  • default 语句是在 switch 语句末尾声明的一个可选的语句,表示在上面所有的 case 匹配结果都不为 true 时执行的语句。 当 switch 语句中的 case 匹配结果都不为 true 且没有 default 语句的时候会直接结束 switch语句。

上例中的 default 语句的执行部分输出 measurement 变量的提示信息和 break 语句:

Console.WriteLine($"测量值为{measurement}."); 
break; 

switch 语句的流程图:
在这里插入图片描述

3,跳转语句

跳转语句表示可以中断当前程序流,并从一个程序点跳转到另外一个程序点继续执行程序。C# 支持的跳转语句包括 break 语句、continue 语句、return 语句和 goto 语句。 借一个简单的示例来讨论这些跳转语句的使用。

3.1 break 语句

break 语句表示将终止当前所在的迭代语句。包括上面所讲到的 for、foreach、while 或 do 语句以及 switch 语句。break 语句可以直接停止迭代语句的执行,并把执行权给后面的程序或直接结束。 以一个示例来演示 break 语句的语法。

示例如下:

int[] numbers = { 1, 2, 3, 4, 5, 6 }; 
        
foreach(int number in numbers)
{
    if(number == 3)
    {
        break;		// 跳出当前 foreach 语句
    }

    Console.WriteLine($"{number}");
}
// 输出: 
// 1 
// 2

break 语句的流程图:
在这里插入图片描述

3.2 continue 语句

continue 语句与 break 语句不同的 continue 语句只跳过当前循环直接进入下一次循环,而 break 语句是跳出整个循环。 continue 语句常用于 while 循环和 for 循环中。 以一个示例来演示 continue 语句的语法。

示例如下:

for (int i = 0; i < 5; i++)
{
    Console.Write($"Iteration {i}: ");

    if (i < 3)
    {
        Console.WriteLine("skip");
        continue;
    }

    Console.WriteLine("done");
}

// 输出: 
// Iteration 0: skip
// Iteration 1: skip
// Iteration 2: skip
// Iteration 3: done
// Iteration 4: done

continue 语句的流程图:
在这里插入图片描述

3.3 goto 语句

goto 语句将控制权转交给带有标签的语句,实现程序从一个点跳转到另外一个程序点执行。 以一个示例来理解 goto 语句。

示例如下:

// 局部变量定义 
int a = 10;

LOOP: do
{
    if (a == 15)
    {
        // 直接跳过迭代
        a++;
        goto LOOP;
    }

    Console.WriteLine($"a 的值:{a}");
    a++; 

} while (a < 20);

// 输出: 
/*
    a 的值:10
    a 的值:11
    a 的值:12
    a 的值:13
    a 的值:14
    a 的值:16
    a 的值:17
    a 的值:18
    a 的值:19 
*/

注意无论什么编程语言,都不建议使用 goto 语句。因为 goto 语句使得程序的控制流难以跟踪,使程序难以理解和难以修改。而且任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。(示例中的功能可以使用 continue 语句实现)

goto 语句的流程图:

3.4 return 语句

return 语句的执行也表示函数的结束,并将控制权和函数结果(若有)返回给函数的调用方,在 C# 中 return 语句的返回值的类型必须和函数的返回类型相同 。return 语句是函数的一个可选项,函数中不是一定要有 return 语句。如果函数成员不计算值,则使用不带表达式的 return 语句。 以一个示例来理解 return 语句。

示例如下:

Console.WriteLine("First call:");
DisplayIfNecessary(6);

Console.WriteLine("Second call:");
DisplayIfNecessary(5);

void DisplayIfNecessary(int number)
{
    if (number % 2 == 0)
    {
        return;
    }
    Console.WriteLine(number);
}
// 输出: 
//First call:
//Second call:
//5 

结语

😀以上就是 C# 常用语句的介绍,希望能够对大家有所帮助。望大家多多支持,你们的支持就是笔者创作最大的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/357637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 基础知识4-2.9 FrameLayout(帧布局)详解

一、FrameLayout&#xff08;帧布局&#xff09;概述 FrameLayout又称作帧布局&#xff0c;它相比于LinearLayout和RelativeLayout要简单很多&#xff0c;因为它的应用场景也少了很多。这种布局没有方便的定位方式&#xff0c;所有的控件都会默认摆放在布局的左上角。 示例1代…

算法队列与栈—Java版

队列、双向队列、栈 — ArrayDeque 使用双向队列ArrayDeque可以完成以上三种数据结构。队列的操作包括&#xff1a;入队、出队、返回队首元素、返回队尾元素、删除队首元素、删除队尾元素、判断空、返回队列长度。双向队列包括&#xff1a;首尾入队、首尾出队、返回首尾元素、…

【挣值分析】

名称解释 拼写解释PV计划费用&#xff0c;预估预算EV挣值&#xff0c;实际预估预算AC实际费用&#xff0c;实际花费CV成本偏差 &#xff08;EV - AC&#xff09;SV进度偏差&#xff08;EV - PV&#xff09;CPI成本绩效指数 &#xff08;EV / AC&#xff09;SPI进度绩效指数 &a…

【Kubernetes】【十】Pod详解 Pod介绍与配置

第五章 Pod详解 本章节将详细介绍Pod资源的各种配置&#xff08;yaml&#xff09;和原理。 Pod介绍 Pod结构 每个Pod中都可以包含一个或者多个容器&#xff0c;这些容器可以分为两类&#xff1a; 用户程序所在的容器&#xff0c;数量可多可少 Pause容器&#xff0c;这是每个…

Mybatis(4)之跟着老杜做一个简单的银行转账会话

这是个MVC项目&#xff0c;我不一定可以完整的实现这个项目&#xff0c;但力求把这个复现出来&#xff0c;尽量的复现细节。 第一步&#xff1a;创建数据库 表 创建表如下&#xff1a; 我们使用 int 是为了方便 然后采用 demcial&#xff0c;精确度较高 添加两个用户 然后…

JVM学习笔记二:运行时数据区概述及JVM线程

目录 概述 JVM各区域划分 JVM线程 线程的内存空间 JVM系统线程 概述 运行时数据区是JVM非常重要的组成部分&#xff0c;这一篇主要介绍运行时数据区各个区域的划分&#xff0c;以及JVM中的线程。 JVM各区域划分 学习JVM&#xff0c;必须牢记下图各个区域的分类&#xff…

【5G RRC】5G系统消息SIB2介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

九龙证券|动力锂离子电池的能量密度可达多少?

现在&#xff0c;我国车用动力锂电池技能道路挑选的是与美国相同的磷酸铁锂道路。毫无疑问&#xff0c;磷酸铁锂离子电池有着许多优势&#xff1a;稳定性高、价格相对便宜&#xff0c;然而其能量密度&#xff08;能量密度更大&#xff0c;才能更好地解决路程问题&#xff09;提…

RabbitMQ 入门到应用 ( 五 ) 基本应用

6.更多应用 6.1.AmqpAdmin 工具类 可以通过Spring的Autowired 注入 AmqpAdmin 工具类 , 通过这个工具类创建 队列, 交换机及绑定 import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.Di…

linux xargs 删除名字中包含某字符串的文件

xargs的作用 格式化输出 可以把多行文本变成一行&#xff0c;或者指定行数和列数。每一列用空格作分隔符号。 test.txt中的内容 例子1&#xff1a; 用xargs格式化输出后,多行变成了一行&#xff0c;而且多个空格变成了一个空格。 cat test|xargs例子2&#xff1a; 当然也可…

go size class 内存块思考

浏览到的一篇文章&#xff0c;让我也有机会反思一下 go 内存管理。网络上&#xff0c;go 内存管理方面的介绍挺多的&#xff0c;面试的时候&#xff0c;偶尔也会被问到内存管理。 而且&#xff0c;从 go1.15 到 go1.16 在 size class 上引入了新的内存块&#xff0c;能直观的看…

信奥一本通1365

1365&#xff1a;FBI树(fbi) 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6443 通过数: 4366 【题目描述】 我们可以把由“0”和“1”组成的字符串分为三类&#xff1a;全“0”串称为B串&#xff0c;全“1”串称为I串&#xff0c;既含“0”又含“1”的串则称为…

C语言——动态内存管理(详解)

1.动态内存管理存在的意义 在前面的C语言的学习中&#xff0c;我们已经掌握的空间开辟的方式有如下两种 int i 0; //开辟了4字节大小的空间存放i int arr[5] {0}; //开辟了20字节的空间存放数组arr这样开辟空间有两个显著的特点&#xff1a; 1、每次开辟空间的大小都是固定…

K8S集群将Docker切换到Containerd

文章目录1. 开启节点维护1.1 将节点设置成不可调度1.2 驱逐节点上的 Pod1.3 停止相关服务2. 升级到 containerd2.1 安装 containerd2.2 调整 containerd 配置2.3 修改 kubelet 启动配置参数3. 重启节点服务4. 验证升级后的节点5. 容器管理工具5.1 容器管理命令行工具对比5.2 cr…

【JavaScript】ES6模块化与异步编程高级用法

一、ES6模块化 1、回顾&#xff1a;node.js遵循了ComminJS的模块化规范。 其中&#xff1a; 导入其他模块使用require()方法模块对外共享成员使用module.exports对象 模块化的好处&#xff1a; 遵守同样的模块化规范写代码&#xff0c;降低了沟通成本&#xff0c;极大方便了…

使用 ApiPost进行WebService 调试,就是这样简单

文章目录5.1 新建一个 HTTP 接口5.2 添加请求Body5.3 设置请求Header5.4 发送请求Apipost 可以用于调试 WebService 请求。具体步骤如下&#xff1a;5.1 新建一个 HTTP 接口 新建一个 HTTP接口&#xff0c;URL 部分填写 endpoint&#xff0c;请求方式选择 POST。以下 URL 为示…

SpringBoot自动装配的原理

前言 在开发SpringBoot项目时&#xff0c;当我们引入spring-boot-starter-xxx依赖后&#xff0c;想要使用依赖中的bean&#xff0c;直接就用Autowired拿来用了&#xff0c;不需要用xml或者注解的方式把它先注入到Spring容器中。这就是自动装配的特性&#xff0c;本文来讲述Spri…

Spring Bean循环依赖

解决SpringBean循环依赖为什么需要3级缓存&#xff1f;回答&#xff1a;1级Map保存单例bean。2级Map 为了保证产生循环引用问题时&#xff0c;每次查询早期引用对象&#xff0c;都拿到同一个对象。3级Map保存ObjectFactory对象。数据结构1级Map singletonObjects2级Map earlySi…

CMake option选项使用方式及注意事项

CMAKE官网 &#x1f358; 在复习 CMake 的时候&#xff0c;使用了 option 功能&#xff0c;发现修改了参数的值之后&#xff0c;和未修改的效果一样&#xff0c;然后不断的查找 option 的使用方法&#xff0c;最后发现并非 option 使用方式而错误&#xff0c;而是 option 第一…

SpringCloudAlibaba-分布式事务Seata

一、介绍官网&#xff1a;http://seata.io/zh-cn/index.html TC (Transaction Coordinator) - 事务协调者维护全局和分支事务的状态&#xff0c;驱动全局事务提交或回滚。TM (Transaction Manager) - 事务管理器定义全局事务的范围&#xff1a;开始全局事务、提交或回滚全局事务…