一、预处理符号与条件编译

a)         可以使用#define指令来定义一些指导预处理器修改源代码的符号,这是由#if、#elif、#else、#endif指令来完成的

#define MACRO1

using System;

public class Program {

   public static void Main() {

#if (MACRO1)

      Console.WriteLine("MACRO1 is defined.");

#elif (MACRO2)

      Console.WriteLine("MACRO2 is defined and MACRO1 is not defined.");

#else

      Console.WriteLine("MACRO2 and MACRO1 are both not defined.");

#endif

   }

}

b)        可以使用#undef指令将前面符号的定义解除。

c)         预处理符号与条件attribute,ConditionalAttribute可以让一个方法基于符号常量的值来定义。

#define __TRACE__

class Program {

   [System.Diagnostics.Conditional("__TRACE__")]

   public static void Trace(string s) {

      System.Console.WriteLine(s);

   }

   static void Main() {

      Trace("Hello");

      System.Console.WriteLine("Bye");

   }

}

//如果没有定义_trace_符号,将显示BYE,如果定义了_trace_符号,将显示hello,bye

 

d)        #error指令和#warning指令。

#error指令将引发一个自定义的编译错误,通常用于防止编译期间符号定义出现冲突。

#define MACRO1

#define MACRO1

#define MACRO2

#if MACRO1 && MACRO2

#error MACRO1 and MACRO2 cannot be defined at the same time

#endif

public class Program {

   public static void Main() {

#if (MACRO1)

      Console.WriteLine("MACRO1 is defined.");

#elif (MACRO2)

      Console.WriteLine("MACRO2 is defined and MACRO1 is not defined.");

#else

      Console.WriteLine("MACRO2 and MACRO1 are both not defined.");

#endif

 

   }

}

e)         #paragma warning disable指令和#paragma warning restore指令。可以暂时关闭C#编译器产生的某些特定的警告信息。

f)         #line指令,用来改变编译错误或警告消息来源的行号。

class Program {

   public static void Main() {

      #line 1 "Method Main()"

      int i == 0;  // <- ERROR : Not allowed to use the operator 鈥?=鈥?

                   //            in this context!

   }

}

以上的代码提示错误在第一行

g)        #region指令和#endregion指令

用鼠标一点就能收起或展开某个特定的代码段。

二、  别名机制

a)        用using关键字可以为命名空间或类型定义别名。

using C = System.Console;

class Program{

   static void Main(){

      C.WriteLine("Hello 1");

   }

}

 

b)        全局限定符

C#2.0引入了全局限定符的概念,当出现在命名空间别名限定符之前时,表示通知编译器要的是一个命名空间的名字。

using System;

class Program{

   class System { }   

   const int Console = 691;

   static void Main(){

      global::System.Console.WriteLine("Hello 1");

      global::System.Console.WriteLine("Hello 2");

   }

}

c)         外部别名:外部别名允许使用分别定义在两个不同程序集中,但类型名称和命名空间都一样的两个类型。如果我们不得不使用同一个程序集的两个不同版本,这种情况就可能发生。见下面的例子:

1、  在引入程序集时引用窗口设置Asm1.dll的别名为AliasAsm1

2、  在引入程序集时引用窗口设置Asm2.dll的别名为AliasAsm2

3、  代码中设置extern alias AliasAsm1及extern alias AliasAsm2;

具体如下:

extern alias AliasAsm1;

extern alias AliasAsm2;

class Program{

   static void Main(){

      AliasAsm1::FooIO.Stream stream1 = new AliasAsm1::FooIO.Stream();

      AliasAsm2::FooIO.Stream stream2 = new AliasAsm2::FooIO.Stream();

   }

}

三、注释和自动文档

a)         注释:用//和///来做程序的注释,而/*…*/用于暂时屏蔽代码

b)        C#有一个选项可以从源代码的///注释中生成注释

c)         使用Ndoc2005将XML文档生成HTML文档

四、标识符

标识符是语法元素的名字,如命名空间名、方法名、类名等。实际上源代码所有能起名字的东西都以标识符为名,标识符的规则:

a)         第一个字符必须是字母、下划线“_”或“@”符号,第一个字符不能是数字

b)        其他字符除了与第一个字符的要求相同(除了不能是@),此外还可以是数字

c)         长度小等于255个字符

d)        标识符不能是C#的关键字

五、命名约定。

a)         PascalCase,即标识符中每个单词的首字母使用大写字母,其他字母使用小写

b)        推荐私有实例成员名采用“m_”前缀,私有静态成员名采用“S_”前缀,而接口名则以大写字母“I”开头

六、控制结构;

a)         C#与C++的控制结构几乎没有差别,switch语句的用法有一点改变,此外增加了新的循环语句foreach用于遍历数组元素

b)        Switch语句,除了switch和case,还有break和default关键字。

Break关键字:执行到break语句时,会直接跳转到switch语句的结尾。注意,如果switch语句的任何一个分支内至少有一条语句,那么该语句就必须以break、goto、或return结尾。

Default关键字:如果表达式的值无法与任何case语句匹配成功,就会执行default语句之后的代码块。注意default语句块不必放在最后

class Program {

   static void Main() {

      int i = 6;

      switch (i){

         case 1:

            System.Console.WriteLine("i equals 1");

            break;

         case 6:

            System.Console.WriteLine("i equals 6");

            break;

         default:

            System.Console.WriteLine("i is not equals to 1 or 6");

            break;

      }

   }

}

可用于Switch语句的类型:

  • 整形数值类型sbyte、byte、short、ushort、int、uint、long、ulong
  • 布尔型bool
  • 枚举类型
  • 字符串类型string

c)         循环语句(do、while、for、foreach)

Break和Continue语句:

可以用continue语句跳过当前循环剩下的部分,达到下一轮循环

可用break语句跳至循环结束。这条语句也是用在switch语句中终止一个语句块的执行,当出现嵌套循环时,这两个语句块的作用范围是最近一层循环。

class Program {

   static void Main() {

      for (int i = 0; i < 10; i++){

         System.Console.Write(i);

         if (i == 2) continue;//当i=2时,跳过当前循环剩下部分,以下语句不执行

         System.Console.Write("C");

         if (i == 3) break;//当i=3时,跳至循环结尾。

         System.Console.Write("B");

      }

   }

}

以上语句的输出结果是:0CB 1CB 2 3C

d)        Break语句还可以用来终止一个所谓的无限循环。无限循环总是条件为真时的for、do/while或while循环。

While(true)

{}

 

e)        Goto语句

class Program {

   static void Main() {

      int i = 0;

      goto label2;

   label1:

      i++;

      goto label3;

   label2:

      i--;

      goto label1;

   label3:

      System.Console.WriteLine(i);

   }

}

f)        Main()方法,与C/C++类似,C#可执行程序的入口函数叫Main();

1、  但C#中的main函数必须是静态方法,可以改变visual studio项目属性Application选项卡的startup object设置启动对象。

2、  Main()方法签名式必须遵循以下规则:必须返回void或int类型;接受一个可选的字符串数组类型,这个字符串数组包含应用程序的命令行参数。

第一个元素表示第一个参数,第二个元素表示第二个参数。

3、  通过项目属性-调试-命令行参数可以传入参数到main函数中;

4、  从命令行传入的消息(同时还有环境变量)可以通过sytem.environment类的string[] GetCommandLineArgs()和IDictionary GetEnvironmentVariables()方法获取。

class Program {

   static void Main(string[] args) {

      if (args.Length == 0)

         System.Console.WriteLine("You didn鈥檛type any number to add.");

      else{

         long result = 0;

         foreach (string s in args)

            result += System.Int64.Parse(s);

         System.Console.WriteLine("Sum :{0}", result);

      }

   }

}

posted on 2010-08-12 10:47  TsingCai  阅读(322)  评论(0编辑  收藏  举报