声明
本文内容来自微软 MVP solenovex 的视频教程——真会C#?- 第1-2章 简介和基础(完结),大致和第 13 课—— 语句(入门) 对应。
本文主要包括以下内容:
- 声明语句。
- 表达式语句。
- 选择语句。
- 迭代语句。
- 跳转语句。
- 其他语句。
语句 Statements
程序执行的操作采用语句表达。 常见操作包括声明变量、赋值、调用方法、循环访问集合,以及根据给定条件分支到一个或另一个代码块。 语句在程序中的执行顺序称为“控制流”或“执行流”。 根据程序对运行时所收到的输入的响应,在程序每次运行时控制流可能有所不同。
语句可以是以分号结尾的单行代码,也可以是语句块中的一系列单行语句。 语句块括在括号 {} 中,并且可以包含嵌套块。
声明语句
表明一个新的变量,也可使用表达式对该变量进行初始化。声明语句以分号;
结束。
string someWord = "rosebud";
int someNumber = 42;
bool rich = true, famous = false;
const double c = 2.99792458E08;
c += 10;
本地变量
本地变量/常量的作用范围是当前的块;同事个块里面(包括里面嵌套的块)不可以声明重名的变量/常量。
static void Main()
{
int x;
{
int y;
int x; // Error - x already defined
}
{
int y; // OK - y not in scope
}
Console.Write (y); // Error - y is out of scope
}
表达式语句
表达式语句是表达式,同样也是合理的语句。表达式语句要么改变了状态,要么调用了可以改变状态的东西,改变状态其实就是指改变变量的值。
// Declare variables with declaration statements:
string s;
int x, y;
System.Text.StringBuilder sb;
// Expression statements
x = 1 + 2; // Assignment expression
x++; // Increment expression
y = Math.Max (x, 5); // Assignment expression
Console.WriteLine (y); // Method call expression
sb = new StringBuilder(); // Assignment expression
new StringBuilder(); // Object instantiation expression
几种可能的表达式语句
- 赋值表达式。(包自增和自减表达式)
- 方法调用表达式。(void 和非 void)
- 对象实例化表达式。
选择语句
选择语句用于根据一个或多个指定条件分支到不同的代码段,控制程序的走向。
选择语句(if,switch)
if 语句
如果 if 后面的 bool 表达式的值为 true,那么 if 语句的内容就会被执行。可使用{}
增加可读性。
else 子句,if 语句可以有 else 子句,else 子句还可以嵌套 if 语句。
if (5 < 2 * 3)
Console.WriteLine ("true"); // true
if (2 + 2 == 5)
Console.WriteLine ("Does not compute");
else
Console.WriteLine ("False"); // False
switch 语句
switch 语句允许你根据变量可能有的值来选择分支程序。可能比 if 语句更简洁一些。
当指定常量的时候,只能使用内置的整数类型,bool,char,enum 和 string 类型。每个 case 子句的结尾,必须使用跳转语句来表明下一步往哪里执行:
- break(跳转到 switch 语句结尾)
- goto case x(跳转到其他 case)
- goto default(跳转到 default 子句)
- 其他的跳转语句 return,throw,continue,goto label
static void ShowCard (int cardNumber)
{
switch (cardNumber)
{
case 13:
Console.WriteLine ("King");
break;
case 12:
Console.WriteLine ("Queen");
break;
case 11:
Console.WriteLine ("Jack");
break;
case -1: // Joker is -1
goto case 12; // In this game joker counts as queen
default: // Executes for any other cardNumber
Console.WriteLine (cardNumber);
break;
}
}
C# 7 增加 switch with patterns 新特性:
- object 类型允许任何类型的变量
- 每个 case 子句指定一个类型,如果变量的类型与该类型一样,那么就匹配成功
- 可能使用 when 来断言一个 case
- case 子句的顺序是有关系的
- 可以 case null
static void Main()
{
TellMeTheType (12);
TellMeTheType ("hello");
TellMeTheType (true);
}
static void TellMeTheType (object x) // object allows any type.
{
switch (x)
{
case int i:
Console.WriteLine ("It's an int!");
Console.WriteLine ($"The square of {i} is {i * i}");
break;
case string s:
Console.WriteLine ("It's a string");
Console.WriteLine ($"The length of {s} is {s.Length}");
break;
default:
Console.WriteLine ("I don't know what x is");
break;
}
}
switch (x)
{
case bool b when b == true: // Fires only when b is true
Console.WriteLine ("True!");
break;
case bool b:
Console.WriteLine ("False!");
break;
}
switch (x)
{
case float f when f > 1000:
case double d when d > 1000:
case decimal m when m > 1000:
Console.WriteLine ("We can refer to x here but not f or d or m");
break;
case null:
Console.WriteLine ("Nothing here");
break;
}
迭代语句
C# 允许一串语句可重复执行,迭代语句有,while,do...while,for,foreach 这些。
while
while 后跟一个 bool 表达式,当值为 true 的时候,会循环重复地执行代码体。这个 bool 表达式在代码体循环执行前被检查。
int i = 0;
while (i < 3)
{
Console.WriteLine (i);
i++;
}
// OUTPUT:
// 0
// 1
// 2
do...while
和 while 差不多,区别于 bool 表达式在代码体执行完之后才被检查。
int i = 0;
do
{
Console.WriteLine (i);
i++;
}
while (i < 3);
for
和 while 差不多,但有特殊的了句用来初始化和迭代变量。出事化子句,在循环开始前执行,用来初始化一个或多个迭代变量;条件子句,bool 表达式为 true 时,会执行代码体;迭代子句,每次语句块迭代之后执行,通常用来更新迭代变量;可以这样for(;;)
实现无限循环。
for (int i = 0; i < 3; i++)
Console.WriteLine (i);
for (int i = 0, prevFib = 1, curFib = 1; i < 10; i++)
{
Console.WriteLine (prevFib);
int newFib = prevFib + curFib;
prevFib = curFib; curFib = newFib;
}
for (;;)
Console.WriteLine ("interrupt me");
foreach
foreach 用来迭代 enumerable 对象里的元素,C# 里大部分集合类型都是 enumerable 的。
foreach (char c in "beer") // c is the iteration variable
Console.WriteLine (c);
// OUTPUT:
// b
// e
// e
// r
跳转语句
跳转语句有 break,continue,goto,return,throw 这些。
跳转语句遵循 try 语句的可靠性原则。跳出 try 块时,在到达跳转目标之前,总会先执行 try 的 finally 块。不可以从 finally 块里面跳转到外面,除了 throw。
break 语句
break 语句可以结束迭代或 switch 语句的代码体。
int x = 0;
while (true)
{
if (x++ > 5)
break ; // break from the loop
}
// execution continues here after break
continue 语句
continue 语句会放弃当前迭代中剩余语句的执行,直接从下一次迭代开始。
for (int i = 0; i < 10; i++)
{
if ((i % 2) == 0) // If i is even,
continue; // continue with next iteration
Console.Write (i + " ");
}
// OUTPUT: 1 3 5 7 9
goto 语句
goto 语句把执行跳转到另一个 label 的语句块。label 相当于一个代码块的占位符,放在语句前面,使用冒号:
做后缀。当用于 switch 语句内时,写作 goto case case 常量(只能用于常量)。
int i = 1;
startLoop:
if (i <= 5)
{
Console.Write (i + " ");
i++;
goto startLoop;
}
// OUTPUT: 1 2 3 4 5
return 语句
return 语句 会退出方法,并返回一个表达式,该表达式的类型和方法的返回类型一致(方法不是 void 的)。return 语句可以放在方法的任何一个地方,除了 finally 块里。
static decimal AsPercentage (decimal d)
{
decimal p = d * 100m;
return p; // Return to the calling method with value
}
throw 语句
throw 语句,抛出异常,表示发生了错误。
其他语句
- using 语句
- lock 语句
网友评论