2.1、C#语法概述
( 1 )、在 C# 中,编译器是忽略空白符的(包括空格和制表符),所以写程序的时候,可以按照自己的习惯来格式化代码,以满足自己的需求。比如一个变量与一个符号之间可以是一个空格也可以是多个空格,也可以没有空格,但是建议有一个空格。
( 2 )、在 C# 中,任何一个语句都是以分号结束的,所以在一行上可以写多条语句,每个语句以分号结束即可。但是一般都是一行写一条语句,不能把一条语句分多行写。
( 3 )、在 C# 中,为了程序更具可读性,一般都要添加很多的注释,在注释的区域内,编译器是不会去编译被注释的内容的,有三种注释方式:
A 、单行注释:在一行之前使用左斜杠“ // ”
B 、多行注释:在要注释的多行前后加上“ /*……*/ ”
C 、对函数、属性等的说明注释“ /// ”,可以对属性、函数、类进行说明,也可以对函数的参数进行说明,以后调用的时候能看到说明了
( 4 )、可以隐藏代码: #region……#endregion
( 5 )、 C# 语言是块结构语言,可以将几个语句包含到“ {} ”中,构成一个块,注意:在块中定义的变量,作用域只在块中。
2.2、C#数据类型的概述
2.3、值类型(简单类型)
( 1 )、 byte 类型
byte 类型是一个无符号整数类型,它占 1 个字节。
( 2 )、 int 类型
int 类型是有符号整数类型,占用 4 个字节。
( 3 )、 long 类型
long 类型是有符号整数类型,占用 8 个字节。
( 4 )、 bool 类型
bool 类型是个逻辑类型,它的值是逻辑值,只有两个,一个是 true ,一个是 false 。对它进行赋值、比较都必须用 true 、 false ,输出也是 true 、 false 。不能赋值为数字。
( 5 )、 double
双精度,占 64 个字节。在程序中任意写的一个浮点数字是双精度。
( 6 )、 float
单精度,占 32 个字节。因为在程序中任意写的一个浮点数字是双精度,而在 C# 中,低精度的数值转换成为高精度的数值可以隐式的转换,但是高精度的转换成为低精度只能显示
的转换。所以要把一个浮点数字直接赋值给单精度变量,会出错,必须显式转换,或者在浮点数字后面加上 f 。
( 7 )、 char
字符是用单引号括起来的,字符串是用双引号括起来的字符序列集合。字符是以数值的形式存放在内存中的,这个数值就是这个字符的编码。编码有很多种的方式,但是主流的就是以下几种:
A 、 ASCII :如果系统采用这种编码方式,这种编码的字符中,数字、字母占用一个字节,汉字占用两个字节。
B 、 Unicode :如果系统采用这种编码方式,这种编码的所有字符统一占用两个字节。
C 、 GB2312 :如果系统采用这种编码方式,这种编码的字符中,数字、字母占用一个字节,汉字占用两个字节。这个是系统的默认编码。
在 C# 中, char 类型占用两个字节,所以不论字符采用何种编码方式,它都可以接受任
意一个字符,比如汉字。但是在 C#.NET 中,默认采用的编码方式是 ASCII 。 C#.NET 中的类型是非常严格的,虽然 char 类型的数据最终是以整数编码的形式存放在内存中,但是不能把整数直接赋值给 char 类型的数据, char 可以直接赋值给 int 整数。
常见的转义字符:
\ ’ |
单引号 |
\ ’’ |
双引号 |
\\ |
右斜杠 |
\0 |
空字符,连空格都不是 |
\a |
响铃 |
\n |
换行 |
\r |
回车 |
\t |
Tab 制表符 |
注意:
( 1 )、在 windows 下回车换行符连用: \r\n ,否则无效,即在一行与另一行之间隐含了 \r\n 两个字符。
( 2 )、在 C# 中,右斜杠 \ 只要出现在字符串中了,那么系统就认为它跟后面的字符一起构成
转义字符,如果这种转义字符是存在的,那么就编译通过,如果转义字符不存在,那么编
译就无法通过,会报错,认为转义字符非法。但是如果在字符串前面加上了 @ 符号,那么
字符串就被认为是逐字符字符串,里面的右斜杠 \ 就会被认为是普通的字符,而不会被认为
是转义字符前面的右斜杠了。
( 3 )、单引号要特别注意,其实在 C# 中不转义,也可以直接使用。
2.4、值类型(枚举类型)
有些变量,不论它的值怎么变化,也只可能是几个固定的值,那么这种变量就可以定义成枚举类型:
Enum typeName
{
Value1 ,
Value2 = 5 ,
Value3 ,
Value4 ,
……
}
枚举值是有值的,默认情况下第一个值是 0 ,后面依次加 1 递增,也可以对枚举值进行赋值,那么以赋值为主,后面的依次加 1 。
( 1 )、定义一个枚举类型的变量:
typeName a ;
( 2 )、给它赋值:
a = typeName.value1;
赋值完成之后,输出的也是枚举值而非数值。
( 3 )、可以将枚举值转换成为整数 :
Int b = (int)a; 或者
int b = Convert.ToInt32(a);
( 4 )、枚举类型是一个类型,类也是一个类型,很显然是一个级别的,所以枚举类型可以定义在类的外面,命名空间下面,这样才比较合理。当然在类的内部去定义枚举类型也可以,但是不推荐这么做。在本项目中定义的类型可以直接引用,但是在别的项目中定义的类型,首先要添加引用,然后再 using (如果 using 省略的话,那么就需要命名空间名 . 类名),然后如果是定义在类外的,那么必须是 public 才可以引用到,如果是在类的内部的,那么不仅要枚举类型是 public 的,还要类是 public 的,引用的时候是类名 . 枚举类型名。
2.5、值类型(结构类型)
在 C#.NET 中,结构体基本不使用,因为面向对象的设计思想中,类可以取代结构体,更加方便。在此主要说明一下类与结构体的区别:
( 1 )、结构体是值类型,而类是引用类型的。
( 2 )、当结构体和类作为函数参数的时候,参数传递时,结构传的是值,类传的是引用。
( 3 )、结构的实例化可以不使用 new 。
( 4 )、结构也可以声明构造函数,但是必须带参数。
( 5 )、结构不能继承。
( 6 )、结构中的字段是不能被初始化的。
2.6、值类型变量的作用域和生存期
非静态变量,只考虑类的内部的情况:
( 1 )、值类型的变量如果是定义在类的内部作为属性变量,那么就具有该类全局作用域,即类内部的函数都可以调用这个变量,哪怕变量定义在函数的下面。但是一般变量都定义在所有的函数之前;一个对象具有一套变量。
类的对象创建开始,该对象这一套变量在该对象中就分配了存储空间,直到该对象释放,那么该对象这一套变量也就释放了。
( 2 )、在函数中,变量的作用域是从定义的位置开始,一直到函数结束为止。在函数中,变量定义的前面是不可以引用该变量的。
在函数中,函数被调用的时候,定义变量的时候,变量就被分配了存储空间,函数结束了,变量就会自动的被释放了。
( 3 )、在函数中的某个块 {} 中定义的变量,作用域是从这个块中定义开始,一直到块结束为止。
函数被调用的时候,定义的时候分配存储空间,块结束的时候就释放了。
但是要特别注意:即使是在块中定义的变量,即使他的作用域只在块中,而不在块外,也不能在块中声明一个与块外同名的变量(这个块外同名变量是指该函数中的,具有从声明开始一直到函数结束为止的作用域的变量,这个变量可以是在块前也可以是在块后的,这个变量不在该函数的另外一个块中)。但是在一个函数的不同的两个块中却可以声明同名的变量。
( 4 )、如果在类中定义的变量与在函数中定义的变量同名的话,那么函数中的变量会覆盖掉类中的,在该函数中,以该函数中定义的变量为主。但是类中的这个变量在其他函数中还是可以引用的。