1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组
一、程序
- 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述。
- 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合
- 程序=数据结构(指程序中的特定数据类型和数据组织形式)+算法(算法是指为达到某个目的所要执行的操作步骤)
二、标示符
- 标识符用来表示程序中的一个特定元素,如类名、方法名、变量名、项目名等等
- 标识符可以是字母、数字、下划线及“@”,但是必须以字母、下划线及@开头,不能以数字开头
- 标识符严格区分大小写
- 可以使用中文做为标识符,但不建议使用
- 不能使用关键字做标识符
- 对于类名和方法名的标识符,一般将每个单词的首字母大写,如StudentInfo;字段及变量名首单词的首字母小写,其他单词首字母大写
三、常量
常量使用const关键字来定义,常量在声明时必须赋值,且以后不能再对其赋值 eg:const int a = 10;
四、数据类型
C#中的数据可以分为两大类:值类型(Value Type)和引用类型(Reference Type)。
值类型包括: 结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型
引用类型包括: 数组,接口,委托,类(用户自定义类、String类、Object类)
值类型的对象,继承自System.ValueType类(此类的对象却是引用类型的),内容直接储存在栈上(以及MSDN中提到的“或在结构中以内联方式分配的”——“or allocated inline in a structure”);引用类型的对象,其内容存储于堆上,栈上的相应变量名下只存储该处的堆地址,长度为4字节/32位(32位操作系统)或者8字节/64位(64位操作系统)。
值类型的对象不能为null。不能从已有的值类型派生新的数据类型。
栈的特点:存放数据类型(值类型),其优点:比在堆上分配空间更快;用完之后立即自动释放;赋值方便(使用等号)
堆的特点:存放引用类型。
值类型的数据类型全部继承自System.ValueType类,它们又分为以下几类:
C#系统自定义了13种数值类型的数据类型:
整型 9种:byte, short, int(系统默认), long sbite, ushort, uint, ulong,char ----类型装换Convert 类
名称 |
值范围 |
系统名称 |
属于CLS |
占用内存长度 |
---|---|---|---|---|
byte |
0至28-1(128) |
System.Byte |
Yes |
1字节/8位 |
sbyte |
-27至27-1 |
System.SByte |
No |
1字节/8位 |
ushort |
0至216-1(65535) |
System.UInt16 |
No |
2字节/16位 |
short |
-215至215-1 |
System.Int16 |
Yes |
2字节/16位 |
char |
\0000至\ffff |
System.Char |
Yes |
2字节/16位 |
uint |
0至232-1(约4.29×109) |
System.UInt32 |
No |
4字节/32位 |
int |
-231至231-1 |
System.Int32 |
Yes |
4字节/32位 |
ulong |
0至264-1(约1.84×1019) |
System.UInt64 |
No |
8字节/64位 |
long |
-263至263-1 |
System.Int64 |
Yes |
8字节/64位 |
浮点型3种:float, double(系统默认), decimal
名称 |
值范围 |
系统名称 |
属于CLS |
精度 |
占用内存长度 |
实例 |
---|---|---|---|---|---|---|
float(单精度) |
±1.5×10-45 至±3.4×1038 |
System.Single |
Yes |
7位 |
4字节/32位 |
float f = 3.14f |
double(双精度) |
±5.0×10-324至±1.7×10308 |
System.Double |
Yes |
15至16位 |
8字节/64位 |
double d = 2.14 |
decimal(高精度) |
±1.0×10-28至±7.9×1028 |
System.Decimal |
Yes |
28至29位 |
16字节/128位 |
decimal d = 2.13M |
布尔型(逻辑)1种:bool
可能的取值为true和false,占用内存长度1字节/8位。C#中不再有类似于“零等于flase,非零int值等于true”的变换。bool型的系统名称为System.Boolean,属于CLS.
其他2种:
enum 枚举
枚举的数据类型的声明:[属性(attributes)] [访问标识(modifiers)] enum 名称(identifier) [:基类型(base-type)] {枚举列表(enumerator-list)} [;]
枚举类型的本意有两点:一是将难以记忆的整型数常量(除char外的8种整型数都可以)标记为更好理解的变量名。二是引入强类型,在需要采用整形数常量表示的变量之间建立屏障。虽然每个字符串代表了一个整形数常量,但是具体使用枚举类数据类型的整型数常量时仍需要强制类型转换。这个整数值在C#默认是int型的。
枚举列表中各个变量的赋值默认是从0开始,递加1的。
例如:enum days:int {Sat, Sun, Mon}; 取值(int)days.Sun为1 或 enum days:int {Sat=1, Sun, Mon}; 取值(int)days.Sun为2
struct 结构体
用户自定义的值类型数据类型,和类相似也有不同(有篇博客具体介绍过);本身没有继承这一特点,因此与继承相关的一切(例如抽象方法)结构体均不具备,除了两点:所有的结构体继承自System.Object类、结构体可以继承(实现)接口。
类 | 结构体 | |
---|---|---|
类型 | 引用类型 | 值类型 |
实例化 | 必须通过new实例化 | 可以不new,直接声明,但声明后必须赋值 |
构造方法(函数) | 方法不受限制(有、无参数均可,默认是无参) | 方法必须带有参 |
继承 | 自身继承System.Object,可继承(包含接口),也可被继承 | 除自身继承System.ValueType外,不可继承(除接口,通常叫做实现接口),也不可被继承 |
成员 | 字段声明时可赋值(初始化) | 字段声明时不可赋值,方法一般公有 |
作参数传递给方法 | 传递的是引用(值一但修改所有指向改类值都已改变) | 传递的是实际值(值修改不会影响其它指向值,除非被ref修饰;ref修饰后传递引用) |
性能介绍:结构是值类型,所以会影响性能,但根据使用结构的方式,这种影响可能是正面的,也可能是负面的。正面的影响是为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。在结构超出了作用域被删除时,速度也很快。另一方面,只要把结构作为参数来传递或者把一个结构赋给另一个结构(例如A=B,其中A和B是结构),结构的所有内容就被复制,而对于类,则只复制引用。这样,就会有性能损失,根据结构的大小,性能损失也不同。注意,结构主要用于小的数据结构。但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速度一样快了。另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。
五、操作符
分类:
赋值操作符: | = |
---|---|
复合赋值运算符: | +=,-=,*=,/=,%= |
算数运算符: | +,-,*,/,%(ß二元运算符),++,--(ß一元运算符) |
条件运算符: | >,<,>=,<=,!=,== |
逻辑运算符: | &&(遇假为假),||(同真为真),! |
位运算符: | &,|,^,~,<<,>> |
备注: |
几乎所有的操作符都只能操作基本数据类型,但是”=”,”==”和”!=”, 这些操作符能操作所有的对象。除此以外String类支持”+”和”+=”。 |
优先级:
postfix operators |
[] . (params) expr++ expr-- |
---|---|
unary operators | ++expr --expr +expr -expr ~ ! |
creation or cast |
new (type)expr |
multiplicative | * / % |
additive | + - |
shift |
<< >> >>> |
relational |
< > <= >= instanceof |
equality | == != |
bitwise AND | & |
bitwise exclusive OR |
^ |
bitwise inclusive OR |
| |
logical AND | && |
logical OR | || |
conditional |
? |
assignment | = += -= *= /= %= &= ^= |= <<= >>= >>>= |
备注 | 上面的操作数优先级从上到下依次降低,同一个单元格内的优先级相同 |
六、循环 注:[]表示可有可无
while (先判断后执行,)
用法:while(循环条件){循环体}
其它用法:while(变量名){ case 变量值1:[执行语句] break;······default:[执行语句] break;}
do-while (先执行一次再判断)
用法:do{循环体}while(循环条件);
for (和while类似,先判断)
用法:for([初始化循环变量];[循环条件];[修改循环变量值]){循环体}
foreach (遍历)
用法:foreach(类型 变量名 in 类型数据列表){}
扩展:continue(跳出本次循环进行下次循环)、break(跳出整个循环)、return(跳出整个方法,可有可无返回值)
七、数组
一维数组:类型[] 变量名 = new 类型[长度];
多维数组(矩形数组):类型[,] 变量名 = new 类型[外长度,内长度];--注:[]里的,等于几维减1
交错数组(数组的数组):类型[][] 变量名 = 类型[长度][];