Tip
本文是已了解至少一种编程语言并正在学习 C# 的开发人员的 “基础知识 ”部分的一部分。 如果你不熟悉编程,请先 学习入门 教程。 有关完整语句语法,请参阅 C# 语言规范中的 语句 。
来自另一种语言? 声明、条件、循环和返回语句,你可能都很熟悉。 本文介绍的 C# 将自己的语法和分类用于这些功能。
语句是一个完整的命令:“执行此操作。一起,程序中的语句构成了程序从头到尾遵循的食谱。 大多数语句按顺序运行。 分支选择要运行的步骤,并循环重复步骤。
此示例声明数量,显示它,然后使用 if 语句决定是否重新库存:
int quantity = 5;
Console.WriteLine($"Quantity: {quantity}"); // => Quantity: 5
if (quantity < 10)
{
quantity = 10;
Console.WriteLine("Restocked"); // => Restocked
}
Console.WriteLine($"Quantity: {quantity}"); // => Quantity: 10
在查看各个组成部分之前,请先将示例作为完整命令来阅读。 声明、第一次对 if 的调用、整个 Console.WriteLine 结构,以及最后一次对 Console.WriteLine 的调用都是语句。 语句中的 if 块包含另外两个语句。
语句通常包含表达式
语句通常包含 表达式,这些表达式是生成值的代码片段。 在前面的示例中,整个 if 构造是一个语句。 其条件 quantity < 10 是一个生成 true 或 false 的表达式。
声明语句引入了局部变量或常量。 初始化器表达式可以提供第一个值:
int quantity = 5;
完整行是声明语句。 初始值设定项 5 是该语句中的表达式。
赋值表达式将值存储在变量、属性、索引器或其他存储位置。 C# 允许赋值表达式形成 表达式语句:
quantity = 10;
此语句执行操作,而不仅仅是计算值。 方法调用和递增操作是其他常见表达式语句:
Console.WriteLine("Restocking");
quantity++;
只有以下几种表达式形式可以作为表达式语句:
- 赋值表达式
- 方法调用表达式
- 对象创建表达式
- 前缀或后缀递增和递减表达式
-
await表达式
并非每个表达式都可以单独作为语句。 例如, quantity + 1; 计算一个值,但不使用它。 这不是有效的语句。
下面是一个有用的工作定义:语句大致类似于英语的完整句子,而 表达式 类似于短语。 这种区别有助于你了解在文档和规范中遇到的正式术语和说明,尽管普通编码很少要求你有意识地记住这种区别。
按块对语句分组
块对大括号({和})之间的零个或多个语句进行分组。 C# 将组视为一个语句。 在开头的示例中,if 语句既可以执行赋值,也可以调用 Console.WriteLine,因为代码块会将它们归为同一个语句体。 块可以嵌套在其他块内。
选择和迭代语句将其正文称为 嵌入语句。 该正文可以是一个没有大括号的语句,也可以是分组多个语句的块。
即使语句体中只有一条语句,也应优先使用代码块。 大括号可明确哪些语句属于代码块,并防止后续编辑时意外将语句放到代码块之外。
块定义变量范围
在块中声明的变量,其作用域从声明处开始,一直到该块结束为止。 嵌套块可以使用封闭块声明的变量,但封闭块不能使用仅在嵌套块中声明的变量:
int outerValue = 10;
if (outerValue > 0)
{
int innerValue = outerValue * 2;
Console.WriteLine(innerValue); // => 20
}
// innerValue isn't in scope here.
为任务选择语句
将语句识别为命令后,可以按用途选择不同类型的语句:
- 声明数据:声明语句引入局部变量和常量。
- 执行操作: 表达式语句分配值、调用方法、创建对象、递增或递减值或等待异步操作。
-
选择步骤:选择语句,例如
if和switch,决定运行哪些代码。 -
重复步骤:迭代语句,例如
foreach,while和for重复语句或块。 -
控制转移:跳转语句,例如
break、continue、return和yield,会将执行转移到另一处。 -
处理异常:异常处理语句,例如
try,catch以及throw响应或报告错误。 -
管理资源: 该
using语句 可确保释放资源。 -
使用专用行为:
checked和unchecked和fixedlock语句支持特定方案。
C# 语言规范
另见
- 语句关键字
- C# 运算符和表达式