1、语句
语句有三种类型:声明语句(声明类型或变量)、嵌入语句(执行动作或管理控制流)、标签语句(控制跳转)
控制流语句:
1、条件语句:
1.1、if语句:TestExpr如果为ture,则执行Statement,如果为false,则跳过Statement不执行。
Statement两句及以上就需要大括号
1.2、if..else...语句:如果Testment为true,则执行Statementq1,否则执行Statement2。
可以嵌套:(经典用法:区分成绩等级)
1.2、switch语句:实现多路分支,哪个分支的Expr与测试表达式TestExpr的值匹配,就执行哪个分支的StatementList。 注意带上break才能实现不穿透。
特别的用法:
case后面的语句可以不是预定义类型的常量,可以是类型,还可以用when加限制条件。
但是注意,编译错误那里是因为不可能执行到哪个语句,不能把限制更多的语句放到限制少的语句后面。
注意:在c#中不可以执行完一个switch段中的代码然后直接执行下一个switch段。但是可以接受多个分叉共同执行某个代码的,只要分支:后面没有可执行语句,例如:
以下也满足“不穿过规则”:
2、循环语句
2.2、while循环:首先求TestExpr的值,如果为true,执行Statement,再求值,真就继续执行,直到为假,跳出循环。
要想让循环不是一个死循环,循环体里应该有不断让测试表达式逼向false的语句,例如递增/递减。
例如:
”
2.3、do循环:首先执行一次statement,然后计算Testexpr的值,如果为真,循环执行statement,如果为假,跳出循环。所以do循环至少执行一次statement。
2.3、for循环:在for循环开始前,先执行Initializer,之后计算TestExpr的值,如果为真,执行Statement,之后执行IterationExpr,再次计算TestExpr的值,如果为真,继续执行Statement,如此循环,直到TestExpr为假跳出循环。
有些部分是可选的,;不能省略,如果TestExpr也省了,那就一直是true,变成死循环了。
例如:
for循环的变量的作用域:Initializer中的变量的作用域仅限于for循环内部,通常都命名为i、j、k。
Initializer和IterationExpr中的表达式可以是多个表达式,需要用“,” 隔开。
3、跳转语句
3.1、break语句:跳出最内层封装语句,可以用在switch、for、foreach、while、do
3.2、continue语句:导致程序执行跳转到循环的最内层封装语句的顶端,可以用在:for、foreach、while、do,例如:
3.3、goto语句:无条件的将控制跳转至标签语句,goto语句必须在标签语句的作用域内。
例如:
4、标签语句:由一个标识符后面:再跟着一个语句组成。执行的时候就好像标签不存在一样,指挥执行后面的语句,标签的作用是允许控制从代码的其他部分跳转至该语句。标签语句只允许在块中使用。
标签有自己的声明空间,所以标识符可以是任意有效的标识符,甚至可以是在重叠作用域内声明的标识符,比如已经声明该名称的局部变量或参数名,但是!不可以与其他标签重名。
标签语句作用域:它声明所在的块以及嵌套的块内部。
5、using语句:某些类型的非托管对象有数量限制或很耗费资源。在代码使用完之后,应尽快释放。using语句有助于简化该过程并确保这些资源被适当处置。
using语句的作用:资源的使用过程包括:分配资源、使用资源、处置资源。在使用资源的过程中如果遇到意外的运行时错误,处置资源的代码有可能得不到执行。using语句就可以帮助减少意外的运行时问题带来的潜在问题。
处理异常的标准做法是,将有可能发生异常的代码块放进try块中,把 无论是否发生异常都要执行的代码放进finnally块中,其实using语句也是这么做的,它的任务是:分配资源、把Statement放进try中,创建资源的Dispose方法的调用,并把它放进finnally中。
例如:
using语句还可以用于相同类型的多个资源,资源声明“,”隔开,还可以嵌套使用。