C# 语言 —— C# 语法基础

C#,与其他 C 风格的语言一样

  • 语句都以分号(;)结尾
  • 语句可以写在多个代码行上,不需要使用续行字符
  • 单行注释 (//),多行注释(\**\
  • 区分大小写

变量

在C#中声明变量使用如下语法:

1
datatype identifier;
  • 声明变量之后,可以用赋值运算符(=)为它赋值;可以在一行代码中,同时声明变量,并初始化它的值;只能在一条语句中声明具有相同数据类型的变量
  • 在C#中必须初始化变量
  • 类型推断使用 var 关键字,变量必须初始化;且在推断出了类型后,就不能改变变量的类型
  • 注意变量的作用域
  • 在变量的前面加上关键字 const,就可以把该变量指定为一个常量,常量必须在声明时初始化;常量总是隐式静态的,不必在常量声明中包含修饰符 static

预定义数据类型

值类型直接存储其值,值类型存储在堆栈中;引用类型存储对值的引用,引用类型存储在托管堆上。

值类型

  • 整型(sbyteshortintlongbyteushortuintulong
  • 浮点类型(doublefloat
  • decimal 类型(精度更高的浮点数,专用于财务计算的类型)
  • bool 类型(只能使用值truefalse
  • 字符类型(字面量需要用单引号括起来,并且可以用 4 位十六进制的 Unicode 值('\u0041')、带有强制类型转换的整数值((char)65)、十六进制数('\x0041')、转义序列)

引用类型

  • object 类型(?)
  • string 类型(字面量放在双引号中,可以包含 Unicode 和十六进制数转义序列。C# 中可以用 @ 在这个字符后所有字符看成表示原来的含义;字符串插值格式,用 $ 前缀来标记)

程序流控制

  • 条件语句
  • 循环
  • 跳转

名称空间

名称空间可以提供了一种组织相关类和其他类型的方式。在 C# 中定义类时,可以把它包括在名称空间中,以后,在定义另一个类时,就可以把它包括在同一个名称空间中,创建一个逻辑组合,告诉使用类的其他开发人员,这两个类是如何相关的以及如何使用它们。

使用注释

源文件中的内部注释

单行注释使用 //,多行注释使用 /**/

XML 文档

C# 有一个非常出色的功能,可根据特定的注释自动创建 XML 格式的文档说明。这些注释都是单行注释,但都以三条斜杠开头。

编译器可以识别的标记见参考文档.

C# 预处理器指令

C# 还有许多名为“预处理器指令”的命令。这些命令从来不会转化为可执行代码中的命令。但会影响编译过程中的各个方面。例如,使用预处理器指令可以禁止编译器编译代码的某一部分。

#define#undef

#define 的用法如下:

1
#define DEBUG

它告诉编译器存在给定名称的符号,类似与声明一个变量,但这个变量并没有真正的值,只是存在而已。只在编译器编译代码时存在,在 C# 代码中并没有任何意义。

#undef正好相反——它删除符号的意义:

1
#undef DEBUG

如果符号不存在,#undef 没有任何意义;同样,如果符号存在,则 #define 不起作用。

必须把 #define#undef 放在 C# 源文件的开头位置,在声明药编译的任何对象的代码之前。

#if#elif#else#endif

这些指令告诉编译器是否要编译代码块。#if#elif 还支持逻辑运算符。

#warning#error

如果编译器遇到 #warning 指令,会向用户显示 #warning 指令后面的文本,之后编译继续进行。如果编译器遇到 #error 指令,就会向用户显示 #error 后面的文本,作为一条编译错误信息,然后会立即退出编译,不会生成 IL 代码。

#regionendregion

#regionendregion 指令用于把一段代码视为有给定名称的一个块,如下所示:

1
2
3
4
#region member field declarations
int x;
stinng y;
#endregion

#line

#line 指令用于改变编译器在警告和错误信息中显示的文件名和行号信息。

#pragma

#pragma 指令可以抑制或还原指定的编译警告。与命令行选项不同,指令可以在类或方法级别实现,对抑制警告的内容和抑制的时间进行更精确的控制。