MSDN,C#2
一、语句
1.结束点和可达性(end points and reachability)
(1)每个语句都有结束点。按照直觉(in intuitive terms),结束点是紧跟在语句后面的那个位置。复合语句(composite statements ,也叫合成语句,即包含嵌入语句的语句)的执行规则规定了(执行)控制到达一个嵌入语句的结束点时所采取的措施(action)。例如,当控制到达块中某个语句的结束点时,控制就转到该块中的下一个语句。
(2)如果语句能够通过执行(遂可能)到达某个语句,则称该语句是可到达的。相反,如果某个语句不可能被执行,则称该语句是不可到达的。
void F() { Console.WriteLine("reachable"); goto Label; Console.WriteLine("unreachable");//不可到达 Label: Console.WriteLine("reachable"); }
(3)如果编译器确定某个语句不可达,虽非错误,但会引发警告(warning)。
为确定某个特定的语句或结束点是否是可达的,编译器遵循为每个语句定义的可达性规则(reachability rules)进行流分析(flow analysis)。流分析考量(take into account)常量表达式的值(该值用来控制语句行为),而并不考虑非常量表达式的可能值。换句话说,从控制流分析(control flow)的角度,给定类型的非常量表达式(如变量)视为那个类型的任何可能值。
//常量表达式,Console.WriteLine非可达 void F() { const int i = 1; if (i == 2) Console.WriteLine("unreachable"); } //虽然事实上不可能执行,但因为是本地变量(表达式),Console.WriteLine可达 void F() { int i = 1; if (i == 2) Console.WriteLine("reachable"); }
(4) 函数成员中的块总是视为可达。通过依次测算块中每条语句的可达性规则,以确定任何给定语句的可达性。
void F(int x) {
Console.WriteLine("start");
if (x < 0) Console.WriteLine("negative"); }
第二个 Console.WriteLine
的可到达性按下面顺序确定:
~第一个 Console.WriteLine
表达式语句是可到达的,原因是 F
方法的块是可到达的。
~第一个 Console.WriteLine
表达式语句的结束点是可到达的,原因是该语句是可到达的。
~if
语句是可到达的,原因是第一个 Console.WriteLine
表达式语句的结束点是可到达的。
~第二个 Console.WriteLine
表达式语句是可到达的,原因是 if
语句的布尔表达式不是常数值 false
。
(5)如下两种情况,控制可到达某语句的结束点,会引起编译时错误:
1'由于 switch
语句不允许一个 switch 节穿越(fall through)到相邻的switch节,因此如果一个switch 节的语句列表的结束点可达,会引出编译时错误,表明该处遗漏掉一个break
语句。
2'如果计算求某值(value)的函数成员块的结束点可达,会引出编译时错误,表明该处遗漏了一个return
语句。
二、语句类型
-
(1)
statement:(语句包括:)
- labeled-statement(标记语句)
-
identifier :
statement
- declaration-statement(声明语句)
-
local-variable-declaration ;
local-constant-declaration ; - embedded-statement(嵌入语句)
embedded-statement(嵌入语句):
- block(块):
- { statement-listopt }
-
statement-list:
-
statement
statement-list statement
empty-statement:(空语句);
expression-statement:(表达式语句)
-
statement-expression ;
statement-expression:
-
invocation-expression
object-creation-expression
assignment
post-increment-expression
post-decrement-expression
pre-increment-expression
pre-decrement-expression
selection-statement:(选择语句) if-statement
switch-statement
iteration-statement(迭代语句) while-statement
do-statement
for-statement
foreach-statement
jump-statement(跳转语句) : break-statement
continue-statement
goto-statement
return-statement
throw-statement
try-statement(try 语句)
checked-statement(checked 语句) : checked block
unchecked-statement(unchecked 语句) unchecked block
lock-statement(lock 语句)
using-statement(using 语句) (2)非结束性(non-terminal)“嵌入语句”用于出现(appear)在其他语句中的语句。 嵌入语句(embedded statement)与普通语句(statement)的区别在于, 嵌入语句在上下文语境中(context)排除声明语句和标签语句(declaration statements and labeled statements)。
//下列的i将引发编译时错误,因为这时的语境要求嵌入语句而非语句 void F(bool b) { if (b) int i = 44; } //但如果i放在块内,则是合法的.三、名字空间 C#使用名字空间来组织程序,它既用作内部的(internal)系统组织,也用作外部的(external)系统组织(向其它程序公开展示程序的元素);
using命令提供用来“便利”名字空间使用(facilitate the use)。
using-alias-directive引入名字空间或类型的别名;
using-namespace-directive导入名字空间的类型成员;
四、类型声明
(1) type-declaration: class-declaration(类声明)struct-declaration(结构声明)
interface-declaration(接口声明)
enum-declaration(枚举声明)
delegate-declaration(委托声明)
(2)类型声明能够作为顶级声明出现在编译单元中,或者作为成员声明出现在命名空间、类或结构内部;
(3)当类型 T
的类型声明作为编译单元中的顶级声明出现时,新声明的类型的完全限定名正好是 T
。当类型 T
的类型声明出现在命名空间、类或结构内时,新声明的类型的完全限定名是 N.T
,其中 N
是包含它的命名空间、类或结构的完全限定名;
(4)在类或结构内声明的类型称为嵌套类型(nested type);
(5)某个类型声明所允许使用的访问修饰符(access modifiers)及默认的访问(default access)取决于出现声明处的环境。
~在编译单元和命名空间中声明的类型可以具有public
或internal(默认)
访问属性。
~在类中声明的类型可以具有 public
、protected
internal
、protected
、internal
或 private
(默认)访问属性。
~在结构中声明的类型可以具有 public
、internal
或 private(默认)
访问属性。