effective hierarchy(一)之 基本概念(8)

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)取决于出现声明处的环境。

           ~在编译单元和命名空间中声明的类型可以具有publicinternal(默认)访问属性。

           ~在类中声明的类型可以具有 publicprotected internalprotectedinternalprivate (默认)访问属性。

           ~在结构中声明的类型可以具有 publicinternalprivate(默认访问属性。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值